2013-02-28 42 views
1

我有一个Xcode 4.2项目,其中包括一个交叉编译窗口的目标。我在该目标中使用C源文件和C++源文件的自定义构建规则,通过自定义脚本调用i386-pc-mingw32-g ++。出于某种原因,即使在编译扩展名为.cpp的文件时,Xcode也会运行我为C源文件指定的自定义脚本。为什么会这样呢?我怎样才能让Xcode 4.2为我的.cpp文件运行“C++源文件”脚本?为什么Xcode 4.2应用C文件为.cpp文件构建规则脚本?

我在这个项目中也有.c文件,并且希望在编译C++文件时使用-std = C++ 11标志来启用一些C++ 11功能。如果我用这个标志编译.c文件,我最终会对math.h中包含的常量产生奇怪的范围问题,我还没有真正尝试和理解 - 我希望我可以让Xcode为我的运行正确的脚本.cpp文件。

任何想法?

更新:我已经能够让Xcode运行正确的脚本。为此,我必须将“C源文件”和“C++源文件”中的“过程”下拉菜单选项更改为“源文件名称匹配:”,然后在提供的文本字段中手动输入*.c*.cpp。现在我必须弄清楚为什么我得到一个M_PI was not declared in this scope错误消息,我之前没有 - 也许不同版本的math.h正在与-std = C++ 11标志一起使用,该标志或者不包含M_PI常量还是在不同的命名空间下提供它?

更新:继续在此工作 - 它看起来我从math.h使用的M_PI值实际上是一个宏,它只有#defined'd,如果__STRICT_ANSI__尚未定义。显然通过使用-std = C++ 11编译器标志切换到C++ 11已经导致这个__STRICT_ANSI__宏被定义,因此我之前使用的M_PI宏不存在。我想最好是定义我自己的pi常量,而不是混淆这个宏的声明,但我可能会深入探讨一下,以澄清为什么现在我正在使用C++ 11旗。

更新:我发现这个职位How can I make C++0x and __STRICT_ANSI__ get along?,这只是暗示 '-std = C++ 11' 标志后取消定义 'STRICT_ANSI' 宏右(或更确切地说,等效“-std =的C++ 0x 'flag。虽然这看起来很简单,但没有人发布过任何问题,因为它似乎也适用于我的情况。此宏中的Gcc文档位于:http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html,并附有以下相关声明:

STRICT_ANSI被预定义使用-ansi选项时,一些头文件可能会注意到此宏和避免从声明某些函数或定义ISO标准不要求的某些宏;这是为了避免干扰任何可能将这些名称用于其他事情的程序。

仍然不确定为什么'-std = C++ 11'标志会导致它在默认情况下被定义(这显然是'-std = C++ 98')。

+0

不是肯定的,但我的猜测是Xcode更喜欢'* .cxx'命名约定。 – 2013-02-28 20:13:41

+0

有趣的是,如果将鼠标悬停在列表中的“C源文件”和“C++源文件”条目上,则会分别得到一个说“sourcecode.c”和“sourcecode.cpp”的小工具提示。 – thamoonisdown 2013-02-28 20:36:46

回答

0

如果您希望在不使用ANSI模式的情况下支持C++ 11,请使用-std=gnu++11而不是std=c++11

+0

我应该知道这两者之间有什么重大区别? – thamoonisdown 2013-02-28 23:20:37

+0

@thamoonisdown:'std = gnu ++ 11'启用编译器和库的GCC扩展。通过禁用扩展,'std = C++ 11'尽可能地遵循标准。通过禁用扩展程序可以获得STRICT_ANSI。在你提到的问题中你提到了'std = C++ 03'。这不是默认设置,它会启用STRICT_ANSI。默认是'std = gnu ++ 03'(你的链接显示这个)。如果你对在缺省情况下处理'M_PI'感到满意,那么'std = gnu ++ 11'是简单添加C++ 11支持的正确方法。 – 2013-03-01 00:49:35

+0

哎呀,我想我误读了默认值。感谢您的澄清。 – thamoonisdown 2013-03-01 01:08:46