在 .cpp 文件中,我使用了一个宏mmData1
。我在项目中进行了搜索,发现这个宏是在几个文件中定义的。(即有几个 .h 文件具有该行#define mmData1
)
我想知道VS10中是否有能力检查预处理器从哪个文件中获取宏值
在 .cpp 文件中,我使用了一个宏mmData1
。我在项目中进行了搜索,发现这个宏是在几个文件中定义的。(即有几个 .h 文件具有该行#define mmData1
)
我想知道VS10中是否有能力检查预处理器从哪个文件中获取宏值
如果 Intellisense 不知道,则没有直接的方法。但是,也有间接的方法。说你的宏名称是SOME_MACRO
在每个#define SOME_MACRO
put实例之后#error Defined here
,然后右键单击源文件并选择Compile
. 如果编译器返回错误,则删除引发它的指令并再次编译。此错误的最后一个实例将拖尾源中可见的定义。
使每个定义的指令将其SOME_MACRO
定义为其他内容,然后在源文件中添加这些行,毕竟包括:
#define STRINGIZE(x) STRINGIZE2(x)
#define STRINGIZE2(x) #x
#pragma message("SOME_MACRO is expanded as: " STRINGIZE(SOME_MACRO))
编译源文件;您应该在构建日志中看到该值。
侵入性较小的方式:将这些行放在每行之后#define SOME_MACRO
#pragma push_macro("STRINGIZE")
#pragma push_macro("STRINGIZE2")
#define STRINGIZE(x) STRINGIZE2(x)
#define STRINGIZE2(x) #x
#pragma message("Defining at " __FILE__ ":" STRINGIZE(__LINE__))
#pragma pop_macro("STRINGIZE")
#pragma pop_macro("STRINGIZE2")
或者,如果您不需要行号:
#pragma message("Defining at " __FILE__)
编译文件。查看构建日志,您应该能够知道SOME_MACRO
定义的顺序。
准确查看预处理器在做什么的最好方法是直接检查它的输出。 Intellisense 很有帮助,但通常与编译器理解的不匹配。
我经常使用的一个简单技巧是在要检查的行重新定义宏。当你编译代码时,预处理器会抱怨并告诉你之前的定义在哪里。
例子:
test.cpp 包含:
#include "test.h"
int main()
{
#define SOMEMACRO 1
return 0;
}
test.h 包含:
#define SOMEMACRO 2
int foo();
编译 test.cpp 时,我收到以下错误消息:
test.cpp:5:0: warning: "SOMEMACRO" redefined [enabled by default]
In file included from test.cpp:1:0:
test.h:1:0: note: this is the location of the previous definition
我在 GCC 上进行了测试,但 Visual Studio 做了同样的事情。