C++ visual studio 2010-c+中的预处理器+;项目
在.cpp文件中,我使用了一个宏C++ visual studio 2010-c+中的预处理器+;项目,c++,visual-studio-2010,c-preprocessor,C++,Visual Studio 2010,C Preprocessor,在.cpp文件中,我使用了一个宏mmData1。我在项目中搜索,发现该宏在多个文件中定义。(即,有多个.h文件具有行#define mmData1) 我想知道VS10中是否有能力检查预处理器从哪个文件获取宏值如果Intellisense不知道,则没有直接的方法。然而,也有间接的方法。说你的宏名是SOME\u macro #pragma push_macro("STRINGIZE") #pragma push_macro("STRINGIZE2") #define STRINGIZE(x) STR
mmData1
。我在项目中搜索,发现该宏在多个文件中定义。(即,有多个.h文件具有行#define mmData1
)
我想知道VS10中是否有能力检查预处理器从哪个文件获取宏值如果Intellisense不知道,则没有直接的方法。然而,也有间接的方法。说你的宏名是
SOME\u 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")
#实例定义一些_宏
后,将#错误定义在此处
,然后右键单击源文件并选择编译
。如果编译器返回错误,请删除引发该错误的指令,然后重新编译。此错误的最后一个实例将跟踪源中可见的定义SOME\u宏的指令定义为其他指令,然后在源文件中添加以下行:
#define STRINGIZE(x) STRINGIZE2(x)
#define STRINGIZE2(x) #x
#pragma message("SOME_MACRO is expanded as: " STRINGIZE(SOME_MACRO))
编译源文件;您应该在构建日志中看到该值
之后#定义一些\u宏
#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__)
编译文件。查看构建日志,您应该能够知道某些\u宏定义的顺序
要准确了解预处理器正在做什么,最好的方法是使用Intellisense,这很有用,但通常与编译器理解的内容不匹配。我经常使用的一个简单技巧是在要检查的行重新定义宏。编译代码时,预处理器会抱怨并告诉您先前的定义在哪里 例如: test.cpp包含:
#include "test.h"
int main()
{
#define SOMEMACRO 1
return 0;
}
#define SOMEMACRO 2
int foo();
试验h包括:
#include "test.h"
int main()
{
#define SOMEMACRO 1
return 0;
}
#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上进行了测试,但visualstudio也做了同样的事情。我相信您可以转到使用宏的位置,然后右键单击宏名称。弹出菜单有“转到定义”和“转到声明”选项。其中一个应该有效,我不记得是哪一个。@blastburne it't work“符号mmData1无法定位”@blastburne不,intellisense在这种情况下没什么作用。你可能会得到一个定义列表,而不是它使用的。对不起,我没有主意了。是的,VS2010在这方面比以前的版本好得多。。。但我仍然是一个粉丝