移除 #pragma once 警告

8
我在我的`.cpp`和`.hpp`文件中使用了`#pragma once`,因此每个使用它的文件都会收到警告。我没有找到任何选项来禁用这种警告,只有使用`#ifndef MY_FILE_H #define MY_FILE_H /*...*/ #endif`的方法。
所以你建议我用`ifndef`代替每个`#pragma once`吗?
头文件中的代码:
#define MYFILE_H
// all the header

在其他文件中:

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

你认为,这样使用是否更好?或者有禁用GCC中#pragma once警告的选项,我不知道吗?

你使用的是哪个版本的GCC?也许是一个不支持#pragma once的旧版本? - Some programmer dude
1
旧版本的GCC会抱怨它不知道的编译指示。C99和C11标准要求(ISO/IEC 9899:2011 §6.10.6 Pragma directive):_任何未被实现所识别的编译指示都将被忽略。_由于编译指示可能会给您带来问题,特别是如果编译器无法识别它并且您多次包含头文件,但头文件保护在任何地方都有效,请使用头文件保护。编译器通常足够聪明以检测到头文件保护。 - Jonathan Leffler
只是提醒:如果您需要删除未知的 #pragma 警告,请使用 -Wno-unknown-pragmas 标志。 - thedarkside ofthemoon
确切的警告信息是什么? #pragma once in main file?相关链接:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89808 | https://dev59.com/ylMI5IYBdhLWcg3wS5gv - Ciro Santilli OurBigBook.com
2个回答

13

常见的做法是仅将守卫放置在 .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 - Tim Beaudet
他可能正在使用一个已过时的GCC版本(3.3之前的版本),虽然这种情况不太可能,但仍有可能会针对#pragma once的使用产生警告。 - ssell
1
@ssell:不,问题是因为我在.cpp文件中也使用了#pragma once - thedarkside ofthemoon
@BlackBird 是的,我忘了。 - ChronoTrigger
在网络系统中,“#pragma once”并不总是可靠的,因此您仍然需要使用包含保护。即使您所有的文件目前都在本地驱动器上,将来也可能不是这种情况。如果您的目标之一是VC ++,那么“#pragma once”将显着影响编译时间。(对于其他编译器,它可能不会改变任何东西。) - James Kanze

-5

实际上可以始终使用#ifndef保护,但仅仅为了在编译使用#pragma once的源代码时消除警告,我建议在编译时使用-w选项。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接