Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ visual studio 2010-c+中的预处理器+;项目_C++_Visual Studio 2010_C Preprocessor - Fatal编程技术网

C++ visual studio 2010-c+中的预处理器+;项目

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

在.cpp文件中,我使用了一个宏
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在这方面比以前的版本好得多。。。但我仍然是一个粉丝