0

(过度依赖 IDE 的案例)

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

例如(PRIVATE解析为static):

#if!defined __cplusplus
#define PRIVATE1 PRIVATE
#endif

...

PRIVATE1 const int some_var;

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

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

编辑:

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

4

7 回答 7

5

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

于 2009-07-27T19:42:15.127 回答
4

如果PRIVATE1解析为PRIVATE,并PRIVATE解析为static,则PRIVATE1解析为static

于 2009-07-27T19:41:40.320 回答
2

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

于 2009-07-27T19:44:20.143 回答
2

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

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

#ifdef __cpluplus.

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

于 2009-07-29T21:43:56.963 回答
1

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

于 2009-07-27T20:28:39.260 回答
0

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

于 2009-07-27T19:44:37.930 回答
0

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

PRIVATE1 void Foo() {
    // __FUNCSIG__ in Visual Studio, not sure about GCC
    std::cout << __FUNCSIG__ << std::endl;
}
于 2009-07-27T20:32:30.297 回答