Mehrfachdefinition einer globalen Variablen [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
Steve Walsch

Mögliches Duplikat:

konstante Variablen funktionieren nicht im Header

In meiner Header-Datei, die ich zum Erstellen eines gemeinsamen Objekts verwende, habe ich Folgendes:

#ifndef LIB_HECA_DEF_H_
#define LIB_HECA_DEF_H_

struct dsm_config {
    int auto_unmap;
    int enable_copy_on_access;
};

enum { NO_AUTO_UNMAP, AUTO_UNMAP } unmap_flag;
enum { NO_ENABLE_COA, ENABLE_COA } coa_flag;

const struct dsm_config DEFAULT_DSM_CONFIG = { AUTO_UNMAP, NO_ENABLE_COA };

<more code ...>

#endif

Beim Kompilieren bekomme ich folgenden Fehler:

cc -g -Wall -pthread libheca.c dsm_init.c -DDEBUG    master.c   -o master
/tmp/cciBnGer.o:(.rodata+0x0): multiple definition of `DEFAULT_DSM_CONFIG'
/tmp/cckveWVO.o:(.rodata+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [master] Error 1

Irgendwelche Ideen warum?

  • Verwenden Sie einfach andere Namensräume

    – Mihai8

    25. Januar 2013 um 16:38 Uhr

Denn mit jedem Include in einer Implementierungsdatei file wird eine neue Instanz Ihrer Struktur erstellt (und in der Objektdatei gespeichert).

Um dies zu vermeiden, deklarieren Sie die Struktur einfach als “extern” in der Header-Datei und initialisieren Sie sie in der Implementierungsdatei:

// In your header file: 
extern const struct dsm_config DEFAULT_DSM_CONFIG;

// In your *.c file:
const struct dsm_config DEFAULT_DSM_CONFIG = { AUTO_UNMAP, NO_ENABLE_COA };

Dies wird Ihr Problem lösen.

Benutzer-Avatar
AnT steht zu Russland

In C-Sprache const Objekte haben standardmäßig eine externe Verknüpfung (im Gegensatz zu C++, wo sie standardmäßig eine interne Verknüpfung haben). Sie haben also in Ihrem Code mehrere Definitionen eines Objekts erstellt DEFAULT_DSM_CONFIG mit externer Verknüpfung – ein klarer Verstoß gegen die Definitionsregeln der Sprache C.

Deklarieren Sie Ihr Objekt entweder als static const (Wenn es Ihnen nichts ausmacht, mehrere Objekte mit intern Verknüpfung) oder entfernen Sie die Definition aus der Header-Datei (lassen Sie nur eine nicht definierende extern const Erklärung dort).

Jedenfalls wurde die Frage schon oft gestellt. Sehen Sie sich konstante Variablen an, die im Header nicht funktionieren, oder führen Sie eine Suche durch.

Jede c-Datei, die Ihre Header-Datei enthält, enthält die Zeile

const struct dsm_config DEFAULT_DSM_CONFIG = { AUTO_UNMAP, NO_ENABLE_COA };

Jede dieser c-Dateien definiert also eine Variable dsm_config. Wenn Sie nur eine Variable dsm_config wollen, müssen Sie die Deklaration in der Header-Datei auf ändern

extern const struct dsm_config DEFAULT_DSM_CONFIG;

und füge die Definition hinzu

const struct dsm_config DEFAULT_DSM_CONFIG = { AUTO_UNMAP, NO_ENABLE_COA };

in nur einer c-Datei.

Eine andere, nicht so gute Lösung besteht darin, die Header-Datei zu ändern

statische Konstante struct dsm_config DEFAULT_DSM_CONFIG = { AUTO_UNMAP, NO_ENABLE_COA };

Dann definiert jede c-Datei ihre eigene dsm_config, die während der Verbindungszeit für andere Übersetzungseinheiten nicht sichtbar ist.

Jede Quelldatei (.c, nicht .h) wird separat kompiliert. In jeder dieser Zusammenstellungen ist die Erklärung von dsm_config mit einem Initialisierer (der = { values… } Teil) erstellt eine Definition von dsm_config. Somit hat das gesamte Programm mehrere Definitionen.

Im Allgemeinen sollten Header-Dateien nur erklären Objekte und nicht definieren Sie. Entfernen Sie dazu den Initialisierer in der Header-Datei und lassen Sie nur die Deklaration ohne Initialisierer. Definieren Sie in einer Quelldatei dsm_config durch Wiederholung der Deklaration mit dem Initialisierer.

1226200cookie-checkMehrfachdefinition einer globalen Variablen [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy