【问题标题】:Remove #pragma once warnings删除 #pragma once 警告
【发布时间】:2014-04-17 14:11:55
【问题描述】:

我在我的.cpps 和.hpps 中使用#pragma once,因此我会收到每个使用它的文件的警告。我没有找到任何禁用这种警告的选项,只有#ifndef MY_FILE_H #define MY_FILE_H /*...*/ #endif 的东西。

那么你会建议我用ifndefs 替换每个#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
  • 旧版本的 GCC 抱怨它不知道的编译指示。 C99 和 C11 标准要求(ISO/IEC 9899:2011 §6.10.6 Pragma 指令):任何无法被实现识别的pragma 都将被忽略。 由于 pragma 会给您带来问题,特别是如果编译器无法识别它并且您多次包含标头,但标头保护在任何地方都可以使用,请使用标头保护。编译器通常足够聪明,可以发现标头保护。
  • 只是一个信息:如果您需要删除未知#pragmas 的警告,请使用-Wno-unknown-pragmas 标志
  • 确切的警告信息是什么? #pragma once in main file?相关:gcc.gnu.org/bugzilla/show_bug.cgi?id=89808 | stackoverflow.com/questions/56563679/…

标签: c++ pragma gcc-warning


【解决方案1】:

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

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

#pragma once
// all your myfile.hpp here

其余文件(其他 .cpp)不应该对守卫做任何事情。这样做不应该收到警告。

【讨论】:

  • 我想补充一点,它应该是 #ifndef MYFILE_H #define MYFILE_H // 你所有的 myfile.hpp #endif
  • 他可能使用的是过时版本的 GCC(3.3 之前的版本),尽管这不太可能,但仍会生成 #pragma once 使用警告。
  • @ssell:不,问题是因为我在.cpp 中也使用了#pragma once
  • @BlackBird 是的,我忘了。
  • 或两者兼而有之。在网络系统中,#pragma once 并不总是可靠的,所以无论如何你都需要包含防护。 (即使您的所有文件当前都在本地驱动器上,将来可能不会如此。)如果您的目标之一是 VC++,#pragma once 将在编译时间上产生显着差异。 (对于其他编译器,它可能不会改变任何东西。)
【解决方案2】:

确实可以始终使用#ifndef 保护,但只是为了在编译使用#pragma once 的源时删除警告,我建议在编译时使用-w选项。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多