当我遇到以下在头文件和源文件中定义的宏时,我正在调查程序中的编译和链接问题:
/* 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?