2013-02-15 64 views
1

1.I看到很多地方,头警卫和编译一次使用起来太在一个特定的顺序(没有顺序居然有关系吗?)头警卫和编译一次

2.Also另一个疑问是默认每当VS IDE生成一个新的类文件时,它就会将#pragma放到实现文件(.cpp)中一次。这真的需要吗?

#ifndef MYHEADER_H 
#define MYHEADER_H 

#pragma once 

//my set of includes 

这是正确的标题守卫或阻止多个包含物的方式吗?

+0

为了获得它的好处,如果还有任何(@jalf),我想你必须先拥有它。 – ChiefTwoPencils 2013-02-15 21:38:20

+0

另请参见[为什么C/C++的“#pragma once”是ISO标准?](http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-标准?rq = 1) – 2013-02-15 21:43:26

回答

2
#pragma once 

尽管得到了许多流行的编译器/预处理器的支持,但它并不是标准的。请参阅Is #pragma once a safe include guard?

#ifndef MYHEADER_H 
#define MYHEADER_H 
#endif // ndef MYHEADER_H 

保证可以与所有C++编译器/预处理器一起使用。

没有必要同时使用两者。

0

“#pragma once”是编译器特有的,可能不是可移植的。 “#ifndef/#define/#endif”更具可移植性,适用于所有预处理器。

+0

那么这是否意味着添加两者的好习惯?我不能说明为什么两个都用在代码中?如果还看到#pragma或者编译器优化会消除#define,它是否会给出任何额外的编译优化? – surega 2013-02-15 21:35:25

+0

我做了#pragma一次,并包括警卫。我从来没有比较过#pragma与包括守卫的表现,但我可以想象,在#pragma之后中止解析比寻找#endif更快。 – 2013-02-18 18:27:26

0

#pragma once与包括卫兵是一样的,但它不是标准。它做同样的事情,一些编译器将编译包含此指令的更快的文件。

它将被不支持它的编译器忽略。

因此,既可以确保代码的可移植性,又可以更快地编译。

+2

不完全正确。旧版本的MSVC可以用'#pragma once'编译得更快。较新版本对标头警卫应用与编译指示相同的优化。 (至少只要标题守卫包含文件中的所有内容,如果你的头部守卫之外有代码(你不应该拥有这些代码),我相信它会禁用这个优化,然后编译将会更快 – jalf 2013-02-15 21:36:34

+0

好吧,但为什么它在实现文件(这是IDE新的类模板)? – surega 2013-02-15 21:37:11

+0

@jalf我不知道这一点,我认为它是在最新版本如果MSVC是相同的,那么我会编辑我的帖子。 – JBL 2013-02-15 21:39:26