被迫在Mac上对C++代码使用正向声明(使用Xcode)
Forced to use forward declarations for C++ code on Mac (using Xcode)
这是一个奇怪的问题,我想知道是否有其他人看到过。我们正在为Mac和PC编写跨平台C++代码,这只发生在Mac上。
假设我有一个类,其.h文件如下所示。
class X {
public:
int _myValue;
void myFunction();
}
我还有另一个类,它的.h文件如下:
#include "X.h"
class Y {
private:
X _myObj;
}
这不会编译。我们得到一个错误,指示X未定义。解决方案是在Y.h文件中为X添加一个正向声明,例如:X类;
我们这样做已经有一段时间了,但现在我们遇到了效果不太好的情况。例如,如果我们有一个.h文件,该文件在.h文件中定义了一个templates方法,而该方法引用了另一个类中的方法,编译器对此一无所知。同样,如果我们引用了一个在包含的类中定义的枚举,编译器无法识别它(解决这个问题的方法是将枚举放在一个单独的.h文件中,它很好地处理了它)。
在编译.cpp文件时,编译器几乎没有从包含的.h文件中提取数据。
我只是想知道是否有人看到过这样的事情,或者有可能的调查途径。
非常感谢。。。
有一个通用的系统头文件X.h
,它是X11窗口工具包的一部分。我建议更改头文件的名称,这样它就不会与任何系统头文件冲突。
您可以尝试更改编译器开关,迫使它在系统包含目录之前考虑包含头文件的目录,但这可能会付出更多的努力,也更脆弱。
对于第一个问题(类),正确的答案是使用正向声明。应避免在其他项目包含文件中包含项目包含文件。这可以创建包含循环(如果我不得不猜测的话,这很可能是您的问题)。当您修改标头时,它还会造成过多的构建混乱。
对于其他问题(枚举、模板),这通常是由于包含周期。通过尽可能避免包含来打破这些周期是你的最佳选择。
有关此问题和最佳实践的更多讨论,请参阅typedefs的头文件最佳实践。
我只是有点惊讶,没有其他人提到包含文件的规范方案,例如
foo.h:
#ifndef FOO_H
#define FOO_H
// body of the include file
#endif
我怀疑在这个特定的情况下,"x.h"answers"x.h"的冲突可能是你看到的问题,但如果你不这样保护包含文件,它最终会咬你一口。
有了这个保护,你可以在任何需要的地方包含"x.h"。
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- 对可变参数使用声明.如何选择正确的功能
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 在类c++中使用new声明数组
- 如何在嵌套类中正确使用友元声明?
- 声明"使用命名空间 C;"对于证明 [namespace.udir]/3 中的示例中显示的结果至关重
- 在C++中声明使用的位置是否有良好做法
- 如何用类别的consumetrized构造函数声明使用类的比较对象设置的STL设置
- 错误:获取线(CIN,名称) 未声明使用"cin"
- 指向成员函数声明/使用问题的可变参数模板指针
- GCC要求此引用声明使用constexpr说明符是否正确
- 被迫在Mac上对C++代码使用正向声明(使用Xcode)
- SDL_DisplayFormat未在此范围中声明:使用SDL2
- 如何在c++中声明/使用外部映射
- 如何在out.write中正确声明/使用具有特定ASCII代码的字符
- 声明使用相同参数的两个不同方法
- 对非函数调用相关声明使用 "extern C"