头文件中出现奇怪的VS++语法错误?(SDL2相关)
Weird VS++ syntax errors in header file? (SDL2 Related)
所以我最近尝试清理我的代码,试图让它对我自己(以及其他人(如果需要的话))更容易。
现在,这可能是因为我对整个C++有点陌生(尽管我在Java方面还有几年的经验)。但我听说(更像是读到的)在头文件中包含头是个坏主意,因为这会让程序的其他部分陷入困境,让事情变得头疼(事实上,我遇到过一些问题,我只需要在".cpp"文件中包含一个头,而且它(显然)包含了我需要的所有内容)。
所以我决定对我的标题做以下操作:
#pragma once
class Game {
(...)
public:
SDL_Window* getPrimaryWindow(void) const;
SDL_Renderer* getPrimaryRenderer(void) const;
SDL_Surface* getPrimarySurface(void) const;
(...)
private:
SDL_Window* mp_primaryWindow = 0;
SDL_Renderer* mp_primaryRenderer = 0;
SDL_Surface* mp_primarySurface = 0;
};
因此,我没有在".hpp"文件中包含任何头,而是在".cpp"文件内。现在,在这两个文件中都不会触发intellisense错误。。。"一切都好"我想。将鼠标悬停在每个变量上,会显示以下内容:
SDL_Window *Game::mp_primaryWindow
如果我把鼠标悬停在类型上:
struct SDL_Window
*brief The Type used to identify a window
(...)
SDL_Renderer和SDL_Surface也是如此。。。一切都很好。
现在,我试着构建这个项目。。。这就是一切走向地狱的地方,并向我抛出以下错误:
error C2143: syntax error: missing ';' before '*'
error C2238: unexpected token(s) preceding ';'
error C4430: missing type specifier - int assumed. Note C++
does not support default-int
所以,那根本没有好处。但是,如果我将#include <SDL.h>
添加到顶部,它的编译和构建都很好。
有人能解释一下发生了什么,为什么会发生,如果我必须回到我的代码中,把所有的include都放回我的头中吗?
是的,当不需要在头中包含头时,应该避免在头中包括头。但是,如果在标头中使用非内置类型,则需要包含定义该类型的标头(将其包含在该标头中),或者需要转发声明该类型。正向声明通常是这样的,尽管它们可能会根据正向声明的类型而有所不同:"class CWindow;",并位于文件的顶部。只有当您有指向类型的指针或引用,但类中没有实际对象,或者实际对象作为参数传递给头中的函数时,正向声明才有效。
请注意,在头中包含头对于编译时间来说大多是不好的。如果你的程序编译不太慢,不要紧张——只要在你的头中包含头,一切都会好起来的。
实际上,有一种情况下,你应该顺便在你的头中包含头。基本上,如果您在页眉中使用某个类"CSomeClass",您可以要求包含页眉的CPP文件在页眉之前也包含"CSomeClass.h",但这会给使用您的类的人带来额外的负担。头文件应该是自包含的,并且应该包括它所需要的所有类型的头,或者应该转发声明它们。
希望能有所帮助!Java和C++在日常使用中有很大不同(:
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- C++语法头文件错误
- 如何摆脱错误c2061;语法错误 cout?
- 语法错误:D3DX10Core 中的标识符'TEXTMETRICA'
- 错误 C2146:语法错误:标识符"A1"之前缺少","
- main.cpp(11):错误 C2059:语法错误:"字符串"
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 如何修复此 FSM C++语法错误 C3867
- 函数错误 C2059:语法错误:'>'不起作用
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- system() 返回错误语法错误:"("意外
- C++图形初始化错误(语法或丢失文件缺陷?
- 获取0:1(1):错误:语法错误,尝试编译着色器时意外$end
- Visual Studio错误:语法错误:标识符