奇怪的Eclipse C ++ #define行为

时间:2009-07-27 19:39:15

标签: c++ c eclipse build-error

(过度依赖IDE的情况)

我有一些遗留的C代码,我为了单元测试而编译为C ++。 C源是C ++感知的,因为它有条件地基于环境定义

E.g。 (PRIVATE解析为static):

#if!defined __cplusplus
#define PRIVATE1 PRIVATE
#endif

...

PRIVATE1 const int some_var;

问题是我似乎无法找到PRIVATE1解析或在C ++中解析的内容,如果我添加声明但是没有指明在哪里,编译器会抱怨重新定义?

我搜索了我的MinGW / gcc包含路径,C ++ ISO规范和我可用的C ++书籍一直无济于事。

编辑:

当然,我在发布之前检查了命令行和makefile。

7 个答案:

答案 0 :(得分:5)

ISO C ++规范中没有这样的内容。最有可能的是,PRIVATE1(以及PRIVATE)在项目的其他地方定义。请注意,这不需要是.h文件中的#define - 它也可以通过makefile中的编译器开关来定义。我建议在项目目录上做一个完整的grep。

答案 1 :(得分:4)

如果PRIVATE1解析为PRIVATEPRIVATE解析为static,则PRIVATE1会解析为static

答案 2 :(得分:2)

它们不太可能(但并非不可能)由MinGW本身定义。由C ++或C实现定义的宏应以下划线开头。

答案 3 :(得分:2)

Eclipse C ++托管项目有点愚蠢!

如果一个项目被声明为C ++,它仍然建立在文件扩展名的基础上,因此.h文件被预处理为C而不是C ++标头,它从另一个头文件中提取#define PRIVATE1,类似地包含:

#ifdef __cpluplus.

然后用g ++链接项目。

答案 4 :(得分:1)

最好的办法是查看预处理器输出。您没有发布正在使用的编译器,但如果您检查文档,则大多数都有“预处理到文件”选项,这将创建一个替换了所有宏的文件。这可能会帮助您弄清楚发生了什么。在Visual Studio中,您使用/ E选项(在C / C ++ - >预处理器 - >生成预处理文件)下将foo.c转换为foo.i.与原始源文件相比,此文件通常是巨大的,因此向下滚动到底部以查看您的代码。

答案 5 :(得分:0)

最有可能在C ++中,它被定义为“私有:”。

答案 6 :(得分:0)

你能用PRIVATE1声明一个函数吗?如果是这样,只需编写一个如下函数:

PRIVATE1 void Foo() {
    // __FUNCSIG__ in Visual Studio, not sure about GCC
    std::cout << __FUNCSIG__ << std::endl;
}