6

在 .cpp 文件中,我使用了一个宏mmData1。我在项目中进行了搜索,发现这个宏是在几个文件中定义的。(即有几个 .h 文件具有该行#define mmData1

我想知道VS10中是否有能力检查预处理器从哪个文件中获取宏值

4

3 回答 3

4

如果 Intellisense 不知道,则没有直接的方法。但是,也有间接的方法。说你的宏名称是SOME_MACRO

  1. 在每个#define SOME_MACROput实例之后#error Defined here,然后右键单击源文件并选择Compile. 如果编译器返回错误,则删除引发它的指令并再次编译。此错误的最后一个实例将拖尾源中可见的定义。

  2. 使每个定义的指令将其SOME_MACRO定义为其他内容,然后在源文件中添加这些行,毕竟包括:

    #define STRINGIZE(x) STRINGIZE2(x)
    #define STRINGIZE2(x) #x
    #pragma message("SOME_MACRO is expanded as: " STRINGIZE(SOME_MACRO))
    

    编译源文件;您应该在构建日志中看到该值。

  3. 侵入性较小的方式:将这些行放在每行之后#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定义的顺序。

于 2012-07-31T07:56:01.223 回答
1

准确查看预处理器在做什么的最好方法是直接检查它的输出。 Intellisense 很有帮助,但通常与编译器理解的不匹配。

于 2012-11-14T05:21:09.383 回答
0

我经常使用的一个简单技巧是在要检查的行重新定义宏。当你编译代码时,预处理器会抱怨并告诉你之前的定义在哪里。

例子:

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 做了同样的事情。

于 2012-11-14T05:31:38.310 回答