ich einen Compiler und Link Problem in meinem Programm zu untersuchen, wenn ich auf das folgende Makro kam, die in einem Header und Quelldatei definiert wurde:Warum erscheint mein #define-Makro global?
/* file_A.c */
#ifndef _NVSize
#define _NVSize 1
#endif
/* file_B.c */
#include "My_Header.h"
#ifndef _NVSize
#define _NVSize 1
#endif
/* My_Header.h */
#define _NVSize 1024
nichts aus dem Üblichen noch, bis ich die folgenden Informationen sah in der GCC-Ausgabe map-Datei:
/* My Map File */
...
.rodata 0x08015694 _NVSize
...
Mein Verständnis der map-Datei ist, dass, wenn Sie ein Symbol in dem .rodata Abschnitt der map-Datei, dieses Symbol zu sehen ist, als globaler Variable vom Compiler behandelt wird. Dies sollte jedoch nicht der Fall sein, da Makros vom Präprozessor behandelt werden sollten, bevor der Compiler die Datei analysiert. Dieses Makro sollte vor dem Kompilieren durch seinen definierten Wert ersetzt werden.
Ist dies die Standardmethode, mit der GCC Makros behandelt, oder gibt es einen implementierungsspezifischen Grund, dass GCC dies als global behandelt (Debug-Einstellung vielleicht)? Was bedeutet das auch, wenn mein Makro in einer anderen Quelldatei neu definiert wird? Habe ich es einfach für eine einzelne Quelldatei neu definiert oder habe ich eine globale Variable geändert, wodurch _NVSize überall in meinem Programm geändert wurde?
Tritt dies auch beim Kompilieren mit Optimierungen/ohne Debugging auf? – delnan
Die Compilereinstellungen für die Datei sind -O1 -MD -ggdb ... –
Ich sehe keine Linker-Einstellungen in der Build-Ausgabe, ich werde dies ausgraben müssen. –