(过度依赖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。
答案 0 :(得分:5)
ISO C ++规范中没有这样的内容。最有可能的是,PRIVATE1
(以及PRIVATE
)在项目的其他地方定义。请注意,这不需要是.h文件中的#define
- 它也可以通过makefile中的编译器开关来定义。我建议在项目目录上做一个完整的grep。
答案 1 :(得分:4)
如果PRIVATE1
解析为PRIVATE
,PRIVATE
解析为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;
}