2014-04-17 159 views
2

我在我的.cpp s和.hpp s中使用#pragma once,因此我得到每个使用它的文件的警告。我还没有找到任何选项来禁用这种警告,只有#ifndef MY_FILE_H #define MY_FILE_H /*...*/ #endif的东西。删除#pragma一次警告

那么你会推荐我用ifndef s代替每个#pragma once吗?

在标题:

#define MYFILE_H 
// all the header 

,并在其他文件:

#ifndef MYFILE_H 
#include "myfile.hpp" 
#endif 
// the rest of the file 

你觉得呢,是它更好地使用它这样的吗?或者有一个选项可以禁用GCC中的#pragma once警告,我不知道?

+0

您使用的是哪个版本的GCC?也许这是一个不支持'#pragma once'的老版本? –

+1

有些旧版本的GCC抱怨它不知道的编译指示。 C99和C11标准要求(ISO/IEC 9899:2011§6.10.6Pragma指令):_任何这样的 'pragma'不能被实现识别的都被忽略._因为编译指示会给你带来问题,特别是如果编译器不能无法识别它,并且您不止一次包含标题,但标头守卫无处不在,请使用标头警卫。编译器通常足够聪明,可以识别标头警卫。 –

+0

只是一个信息:如果您需要删除未知'#pragma'的警告,请使用'-Wno-unknown-pragmas'标志 –

回答

9

常见的方法是将保护仅在.h文件中:

#ifndef MYFILE_H 
#define MYFILE_H 
// all your myfile.hpp here 
#endif 

#pragma once 
// all your myfile.hpp here 

文件的剩余部分(其他的.cpp)应该做的关于卫兵什么。这样做你不应该得到警告。

+1

我只想补充说它应该是 #ifndef MYFILE_H #define MYFILE_H //你所有的myfile.hpp这里 #endif –

+0

他可能会使用过时的GCC版本(3.3版本),它仍然可以为#pragma once使用产生警告,尽管这不太可能。 – ssell

+0

@ssell:不,问题是因为我在'.cpp'中使用了'#pragma once' –

0

事实上,#ifndef守卫总是可以使用,但只是为了在编译使用#pragma once的源代码时删除警告,我建议在编译时使用-w选项。

例如gcc -w -o <output file> <input file(s)>