2014-04-17 162 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)>