代码之家  ›  专栏  ›  技术社区  ›  Paweł Hajdan

如何知道(在GCC中)何时声明给定的宏/预处理器符号?

  •  10
  • Paweł Hajdan  · 技术社区  · 17 年前

    请随意添加评论和澄清请求。

    6 回复  |  直到 10 年前
        1
  •  18
  •   Johannes Schaub - litb    17 年前

    使用-E:

    # shows preprocessed source with cpp internals removed
    g++ -E -P file.cc
    # shows preprocessed source kept with macros and include directives 
    g++ -E -dD -dI -P file.cc  
    

    上面的内部代码是gcc的行标记,当您阅读输出时,这些代码有点让人困惑。 -P

     -E  Stop after the preprocessing stage; do not run the compiler proper.  
         The output is in the form of preprocessed source code, which is sent to the 
         standard output.
    
         Input files which don't require preprocessing are ignored.

        2
  •  5
  •   Max Lybbert    14 年前

    I know a solution to that . 用已经定义为非法C++代码的符号编译文件(链接到使用@)。所以,对于GCC,您可以编写

    gcc my_file.c -Dfoo=@
    

    当它扩展时,肯定会导致语法错误,编译器应该告诉您语法错误所在的文件,这将非常有用。

    如果使用Raymond Chen建议的技巧,编译器 也许 告诉您“冲突”的定义来自何处,以及 给你一份清单,说明它是如何被收录的。但这不能保证。因为我不使用宏(我更喜欢const和enum),所以我不能说GCC是否是这方面更智能的编译器之一。我不相信C或C++标准会对此表示任何意见,除了预处理器运行后,你会丢失各种有用的信息。

        3
  •  2
  •   Loki Astari    14 年前

    g++ -E -dM file.cpp | grep MACRO
    
        4
  •  1
  •   flolo    17 年前

    对于“to what it will expand”,我使用gcc中的-E开关,它提供预处理的输出。但是没有回溯哪个宏来自哪里(或者是否有宏)。

    您可能使用的另一个选项是-g3,这将添加有关宏的调试信息,即,您稍后可以在调试器中看到每个宏的定义。

        5
  •  1
  •   Brian    17 年前

        6
  •  0
  •   user7305    17 年前

    使用#警告。它被描述了 here