头文件中奇怪的VS ++语法错误? (SDL2相关)

时间:2015-04-06 03:32:54

标签: c++

所以我最近试图清理我的代码,试图让自己(以及其他人,如果需要)更容易。

现在,这可能是因为我对整个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”文件中。现在,在任何一个文件中都没有触发智能感知错误......“我认为一切都很好”。将鼠标悬停在每个变量上,显示如下:

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>添加到顶部,它会编译并构建正常。

有人可以解释发生了什么,为什么会发生这种情况,以及是否必须重新检查我的代码并将所有包含放回我的标题中?

1 个答案:

答案 0 :(得分:0)

是的,当您不需要包含标题时,应该避免在标题中包含标题。如果您在标头中使用非内置类型,则需要包含定义该类型的标头(将其包含在该标头中),或者您需要转发声明该类型。前向声明通常看起来像这样,尽管它们可能会根据您前面声明的类型而有所不同:“class CWindow;”并转到文件的顶部。只有当你有类型的指针或引用,而不是类中的实际对象,或实际对象作为参数传递给标题中的函数时,前向声明才有效。

请注意,在标头中包含标头大多只是编译时间不好。如果您的程序编译速度太慢,请不要强调 - 只需在标题中包含标题,一切都会好的。

实际上有一种情况你应该在标题中包含标题。基本上,如果在标题中使用某个类“CSomeClass”,则可能要求包含标题的CPP文件在标题之前也包含“CSomeClass.h”,但这会给使用您的类的人带来额外负担。您的头文件应该是自包含的,并且应该包含它所需的所有类型的头,或者应该转发声明它们。

希望有所帮助! Java和C ++在日常使用方面有很大不同(: