【问题标题】:Strange Eclipse C++ #define behaviour奇怪的 Eclipse C++ #define 行为
【发布时间】:2009-07-27 19:39:15
【问题描述】:

(过度依赖 IDE 的案例)

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

例如(PRIVATE 解析为 static):

#if!defined __cplusplus
#define PRIVATE1 PRIVATE
#endif

...

PRIVATE1 const int some_var;

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

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

编辑:

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

【问题讨论】:

  • 您应该回答自己的问题,然后接受您的回答。这有两个好处:首先,它向后来的读者清楚地表明有一个可接受的分析器;第二,它可以让你在实际解决问题方面获得一些声誉......
  • @RBerteig - 以“正确”的方式提出并回答。谢谢。

标签: c++ c eclipse build-error


【解决方案1】:

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

【讨论】:

  • “C++ ISO 规范和我可用的 C++ 书籍都没有用。”
【解决方案2】:

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

【讨论】:

  • 无法击败这种逻辑...... :-)
  • 您错过了这个定义在 #if !__cplusplus 块中的事实。 IE。它不适用于 C++ 编译器,但后者以某种方式弄清楚 PRIVATE 是什么 - 所以问题是,它是如何做到的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    #ifdef __cpluplus.
    

    然后项目通过 g++ 链接。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        很可能在 C++ 中它被定义为“private:”。

        【讨论】:

        • Mosdt 可能不会,因为 OP 的代码会扩展为语法错误。
        • 对不起,我的意思是“私人:”,这将是有效的
        • 那么它需要成为类的一部分。由于它可以在 C 和 C++ 中编译,因此它很可能不是类的一部分。
        • 它可以是结构的一部分。 C++ 中结构体和类之间的唯一区别是结构体默认为公共,而类默认为私有。
        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-08
          相关资源
          最近更新 更多