为什么我的#include的顺序很重要? (C ++)

时间:2009-05-14 21:10:17

标签: c++ header include

我创建了一个名为“list_dec.h”的头文件,将其放在“C:\ Headers”文件夹中,并将我的编译器设置为包含“C:\ Headers”中的文件,所以现在我可以做的事了像

#include<list_dec.h>
int main(){return(0);}

但当我尝试做类似

的事情时
#include<iostream>
#include<list_dec.h>
int main(){return(0);}

我得到一个错误(不是特定的,只是“list_dec.h”中的一大堆语法错误,我知道这不是真的,因为我已经能够将它编译为main.cpp文件和单独项目中的.h文件)。但是,当我更改为订单时,“list_dec.h”位于顶部:

#include<list_dec.h>
#include<iostream>
int main(){return(0);}

所有错误都消失了。那么为什么错误的顺序很重要?

注意:据我所知,当我使用“list_dec.h”包含所有头文件时会发生这种情况,但我发现它绝对肯定的文件是:

#include<iostream>
#include<vector>
#include<time.h>
#include<stdlib.h>

编辑:这些是我在“list_dec.h”低于任何其他标题时得到的错误:

c:\headers\list_dec.h(14) : error C2143: syntax error : missing ')' before 'constant'
        c:\headers\list_dec.h(51) : see reference to class template instantiation 'list<T,limit>' being compiled
c:\headers\list_dec.h(14) : error C2143: syntax error : missing ';' before 'constant'
c:\headers\list_dec.h(14) : error C2059: syntax error : ')'
c:\headers\list_dec.h(14) : error C2238: unexpected token(s) preceding ';'
c:\headers\list_dec.h(69) : warning C4346: 'list<T,limit>::{ctor}' : dependent name is not a type
        prefix with 'typename' to indicate a type
c:\headers\list_dec.h(69) : error C2143: syntax error : missing ')' before 'constant'
c:\headers\list_dec.h(69) : error C2143: syntax error : missing ';' before 'constant'
c:\headers\list_dec.h(69) : error C2988: unrecognizable template declaration/definition
c:\headers\list_dec.h(69) : error C2059: syntax error : 'constant'
c:\headers\list_dec.h(69) : error C2059: syntax error : ')'
c:\headers\list_dec.h(78) : error C2065: 'T' : undeclared identifier
c:\headers\list_dec.h(78) : error C2065: 'limit' : undeclared identifier
c:\headers\list_dec.h(78) : error C2065: 'T' : undeclared identifier
c:\headers\list_dec.h(78) : error C2065: 'limit' : undeclared identifier
c:\headers\list_dec.h(79) : error C2143: syntax error : missing ';' before '{'
c:\headers\list_dec.h(79) : error C2447: '{' : missing function header (old-style formal list?)

如果有帮助,这些是错误中提到的行(14,19,78和79):

第14行:list(const T& NULL); (A constructor for "list" class)

第69行:inline list<T, limit>::list(const T& NULL): (Definition for the constructor, also, the colon at the end is intentional, It part of the definion ie: void x(int n): VAR(n).)

第78行:inline list<T, limit>::list(const list<T, limit>& lst) (def for the copy constructor)

第79行:{ (the begining of the list-copy contructor)

很多人都希望看到“list_dec.h”的开头:

template<class T, size_t limit>
class list

注意:这些不是第一行,但它们是我认为问题所在的地方,它们之前的行只是一个名为“err”的枚举。

编辑:只是一个注释,“list_dec.h”不包含任何包含,定义,ifdef或任何前面带有'#'的内容。除了枚举之外,它只包含“list”类声明和“list”类成员函数定义。

5 个答案:

答案 0 :(得分:10)

一般来说它不应该,但是有可能存在冲突的符号或预处理器宏的定义,最终会使编译器混淆。尝试通过从冲突的标题中删除片段和包含来缩小问题的大小,直到您可以看到导致它的原因。

为了响应您发布的错误消息,符号NULL通常被实现为数字0的预处理器宏。这样您就可以轻松地将其用作空指针。因此:

list(const T& NULL);

预处理器可能会将此语法错误转换为

list(const T& 0);

将参数名称更改为NULL以外的其他名称。

答案 1 :(得分:3)

请注意:

Line 14: list(const T& NULL); (A constructor for "list" class)

NULL是标准宏的名称 - 当在list_dec.h之前包含标准头文件时,很可能会导致NULL被定义,从而导致代码看起来像这对编译器来说:

list(const T& 0);

上面的常量0使得行格式错误的C ++。您可以通过指示编译器生成预处理的输出文件来获取更多信息。

答案 2 :(得分:2)

据推测,list_dec.h正在运行一个宏,该宏在那些其他标题中定义(或者它们反过来包含一些标题) - 很难说哪一个没有看到第一条错误消息和list_dec.h的相关部分!< / p>

答案 3 :(得分:2)

实际的错误会给出一个更具体的线索,这意味着你的包含文件中有一些东西会搞砸下一个扫描。最常见的事情是某种类型的“#directive”,例如#if错过了#endif

答案 4 :(得分:1)

如果错误本质上是随机的,则可能是缺少的半冒号。编译器通常会停止,但有时你会“幸运”。

否则,冲突的名称或定义。你有什么名为std的例子吗?