gpt4 book ai didi

c - 为什么我的#define 宏看起来是全局的?

转载 作者:太空狗 更新时间:2023-10-29 15:33:26 26 4
gpt4 key购买 nike

当我遇到在头文件和源文件中定义的以下宏时,我正在调查程序中的编译和链接问题:

/* 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?

最佳答案

我认为编译器可以自由地将您的宏分配给全局变量只要它确保产生与文本替换完全相同的结果即可。

在编译过程中,编译器可以特别标记这个全局,表示它是一个宏常量值,所以不能重新赋值,不能取地址等。

如果您在源代码中重新定义宏,编译器可能不会执行此转换(并按您的预期对待它:预编译器文本替换),对不同值之一(或所有值)执行它他们说,每次出现时使用不同的名称),或者做其他事情 :)

关于c - 为什么我的#define 宏看起来是全局的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10161922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com