【发布时间】:2013-08-01 16:04:32
【问题描述】:
我正在学习一本书 (iPhone 3D Programming) 中的教程,该教程使用:
- Objective-C 头文件和源文件(文件扩展名分别为 .h、.m),
- Objective-C++ 头文件和源文件(文件扩展名分别为 .h、.mm)
- C++ 头文件和源文件(文件扩展名分别为 .hpp、.mpp)
包含一个sample Xcode project,编译成功。
在找到示例项目之前,我已经手动输入了书中的代码,但是对于下面详述的文件,我收到了以下编译错误:
- 未知类型名称“虚拟”
- 预期的成员名称或“;”在声明说明符之后
IRenderingEngine.hpp(Xcode 文件检查器 - 文件类型 = “默认 - C++ 标头”)
...
struct IRenderingEngine {
virtual void Initialize(int width, int height) = 0; //2 errors as marked above
virtual void Render() const = 0; //2 errors as marked above
virtual void UpdateAnimation(float timeStep) = 0; //2 errors as marked above
virtual void OnRotate(DeviceOrientation newOrientation) = 0; //2 errors as marked above
virtual ~IRenderingEngine() {} //2 errors as marked above
};
...
- 必须使用“struct”标签来引用类型“IRenderingEngine”
GLView.h (Xcode File Inspector - File Type = "Default - C Header")
#import "IRenderingEngine.hpp"
#import <QuartzCore/QuartzCore.h>
@interface GLView : UIView {
@private
EAGLContext* m_context;
IRenderingEngine* m_renderingEngine; //1 error marked above
float m_timestamp;
}
- (void) drawView:(CADisplayLink*)displayLink;
- (void) didRotate:(NSNotification*)notification;
@end
所有其他文件的文件类型也默认为其在 Xcode 文件检查器中的预期文件类型,因此应该可以与构建设置正常工作 - Apple LLVM 编译器 4.2 - 语言 - “编译源为 = 根据文件Type" - 与编译成功的示例项目中的 Build Setting 相同。
由于某些奇怪的原因,在我手动创建的项目中将 Build Setting 更改为“Compile Sources As = Objective-C++”消除了编译错误,并且应用程序按预期运行。
谁能解释为什么这个设置在看似相同(源代码方面)的项目之间不一致?
【问题讨论】:
-
将包含第一个 sn-p 的文件的文件类型从 .m 更改为 .mm。重要的是 .m/.mm 的文件类型。
-
@HotLicks 第一个代码 sn-p 确实是 C++,如文件名 IRenderingEngine.hpp 所示
-
包含文件的名称可以是 IRenderingEngine.i'mC++,它不会有任何区别。重要的是编译文件的类型。
-
Right and Xcode's File Inspector 显示 File Type = "Default - C++ Header" 所以我想这是编译器用来确定如何处理它的,但由于某种原因我不得不强行告诉它通过更改构建设置“Compile Sources As = Objective-C++”将所有文件视为 Objective-C++ 以使项目编译。
-
不,头文件类型与它无关。除非它是可编译类型(.c、.m、.cpp、.mm),否则它基本上会被忽略。它是包含决定如何处理代码的头文件的可编译文件。
标签: xcode objective-c++