我正在处理一个项目,每个头文件都有一个预处理器包含守卫。我的包含方式如下:
(文件->包含)
main.cpp -> header.h; Character.h
header.h -> vector, iostream, ... , DataFiles.h
Character.h -> DataFiles.h,header.h,CharFrame.h
CharFrame.h -> DataFiles.h,header.h
一切都工作得很好。但是如果我只删除 main.cpp 的 #include "Character.h" 并将其移动到 header.h 中,编译时会出现很多错误。所以现在是这样的:
main.cpp -> header.h
header.h -> ... , DataFiles.h, Character.h.
有什么区别?
以下是我的编译器输出:
(文件->包含)
main.cpp -> header.h; Character.h
header.h -> vector, iostream, ... , DataFiles.h
Character.h -> DataFiles.h,header.h,CharFrame.h
CharFrame.h -> DataFiles.h,header.h
一切都工作得很好。但是如果我只删除 main.cpp 的 #include "Character.h" 并将其移动到 header.h 中,编译时会出现很多错误。所以现在是这样的:
main.cpp -> header.h
header.h -> ... , DataFiles.h, Character.h.
有什么区别?
以下是我的编译器输出:
Inspiron-1545:~/Desktop/LF2_linux$ g++ -Wall main.cpp DataFiles.cpp header.cpp Character.cpp CharFrame.cpp -lSDL -lSDL_image -lSDL_ttf -o test
In file included from header.h:13:0,
from CharFrame.h:12,
from CharFrame.cpp:1:
Character.h:55:15: error: ‘CharFrame’ was not declared in this scope
Character.h:55:25: error: template argument 1 is invalid
Character.h:55:25: error: template argument 2 is invalid
如果将include放回到main.cpp中,则可以编译而不会出现任何错误。
如果您认为我的代码是必要的,我会编辑此帖并粘贴所有内容。
以下是需要关注的行:
header.h:13 ->
#include "Character.h"
CharFrame.h:12 ->
#include "header.h"
CharFrame.cpp:1 ->
#include "CharFrame.h"
Character.h:55 ->
std::vector <CharFrame*> *frame;
header.h
使用了CharFrame
,但是它在CharFrame.h
中声明之前就已经被包含(使用)了。因此编译器在CharFrame
被声明之前就遇到了它。 - Violet Giraffe