【问题标题】:Xcode and Clang mysteriously include headers I don't specifyXcode 和 Clang 神秘地包含我未指定的标头
【发布时间】:2012-07-10 20:27:47
【问题描述】:

我有一个带有以下代码的标头,其中包含源自头文件 /usr/include/sys/param.h 中 CROUND 定义的神秘错误,该头文件既不包含在代码本身中,也未包含在命令行参数中:

#ifndef _PARSERTYPES_H_
#define _PARSERTYPES_H_    

#ifdef CROUND
#warning #undef CROUND applied, defined in /usr/include/sys/param.h  
#undef CROUND
#endif // CROUND
enum TokType
{
  FLOATING, INTEGER, STRING, SYMBOL,
    OCURLY, CCURLY, OROUND, CROUND, OSQUARE, CSQUARE, 
};    

#endif // _PARSERTYPES_H_

使用简化的 clang (c++) 或 gcc (g++) 编译器命令编译:

cd /path/to/build3/modules/device/examples/sweep && /usr/bin/g++   -DQT_OPENGL_LIB -DQT_DESIGNER_LIB -DQT_GUI_LIB -DQT_SQL_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -D__DC1394__ - -DQT_NO_DEBUG -O3 -DNDEBUG -I/path/to/modules//. -I/opt/local/include -I/opt/local/include/opencv -I/usr/local/include -I/opt/local/include/QtOpenGL -I/opt/local/include/QtDesigner -I/opt/local/include/QtGui -I/opt/local/include/QtSql -I/opt/local/include/QtNetwork -I/opt/local/include/QtCore -I/Library/Frameworks/FreeType.framework/Headers -F/Library/Frameworks -I/opt/local/include/glib-2.0 -I/opt/local/lib/glib-2.0/include -I/opt/local/include/gdk-pixbuf-2.0 -I/opt/local/include/gtk-2.0 -I/opt/local/lib/gtk-2.0/include -I/Library/Frameworks/cairo.framework/Headers -I/opt/local/include/pango-1.0 -I/opt/local/include/atk-1.0    -o CMakeFiles/Example.dir/Example.cpp.o -c /path/to/modules/Example.cpp

这会产生以下(clang)错误:

In file included from /path/to/parser/parser.h:69:
path/to/parser/parserTypes.h:58:26: error: expected '}'
        OCURLY, CCURLY, OROUND, CROUND, OSQUARE, CSQUARE, 
                                ^
/usr/include/sys/param.h:171:16: note: expanded from macro 'CROUND'
#define CROUND  (CBLOCK - 1)    /* Clist rounding. */
                ^
/path/to/parser/parserTypes.h:56:1: note: to match this '{'
{

我能够解决 #undef CROUND 的问题,但显然这是一个非常临时的解决方案。

这个问题的根源和解决方案可能是什么?

【问题讨论】:

    标签: c++ compiler-errors cmake xcode4.3 clang


    【解决方案1】:

    你可能包含了一些系统头文件,对吧?这些通常包括一大堆其他标题...

    编辑:至于解决方案...

    a) 使用不冲突的其他名称

    b) 在相当新的编译器上,使用 enum 类(除非您与宏冲突...这里似乎就是这种情况)

    编辑 2:一般来说,我不建议尝试通过诸如#defining 包含保护宏或类似东西的廉价技巧来“解决”其他标头。最好不要管系统标头。

    【讨论】:

    • 这就是我问这个的原因,我希望在 OS X 或其他东西上默认包含某种系统标头。该代码中没有包含,因为它完全由值定义组成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多