ヘッダーとソースファイルで定義されている次のマクロに遭遇したとき、プログラム内のコンパイルとリンクの問題を調査していました。
/* 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
GCC出力マップファイルに次の情報が表示されるまで、まだ異常なことはありません。
/* My Map File */
...
.rodata 0x08015694 _NVSize
...
マップファイルについての私の理解は、マップファイルの.rodataセクションにシンボルが表示されている場合、このシンボルはコンパイラによってグローバル変数として扱われているということです。ただし、コンパイラがファイルを解析する前にマクロをプリプロセッサで処理する必要があるため、これは当てはまりません。このマクロは、コンパイルする前に、定義された値に置き換える必要があります。
これはGCCがマクロを処理する標準的な方法ですか、それともGCCがこれをグローバル(デバッグ設定の可能性があります)として扱う実装固有の理由がありますか?また、マクロが別のソースファイルで再定義された場合、これはどういう意味ですか?単一のソースファイルに対して再定義しただけですか、それともグローバル変数を変更して、プログラム内で使用されているすべての場所で_NVSizeを変更しましたか?