如何消除 #pragma region 的 GCC 警告?

13
如何消除GCC对#pragma region的警告? 我添加了pragma region以便更轻松地查看代码,但它会报告#pragma region的警告。 我正在使用Visual Studio 2010。

4
你是否在使用Visual Studio 2010编译时选择了GCC? - logoff
可能有用的阅读材料:http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html - altendky
我的建议是:重构代码。将该区域转换为单独的函数。 - user877329
6个回答

17

gcc有这样一个警告标志:

-Wunknown-pragmas 当GCC遇到无法理解的#pragma指令时发出警告。如果使用此命令行选项,甚至会对系统头文件中的未知pragma发出警告。如果警告只是由于-Wall命令行选项启用,则不会出现这种情况。

和往常一样,您可以否定它,这意味着未知的pragma将不会收到警告,即使用-Wno-unknown-pragmas

请注意,-Wno-unknown-pragmas必须出现在打开此警告的任何命令行标志之后,例如-Wall - 这也禁用了所有未知pragma的警告,因此请谨慎使用。


4
只是追求严谨,这个选项会关闭所有编译指示的警告,不可能挑选哪个编译指示应该发出警告,哪些不应该。 - Some programmer dude
是的,@JoachimPileborg,这个诊断(unknown-pragmas)有时可以拯救生命,如果你搞砸了omp指示符或类似的东西... - Tomasz Gandor

12

不要在GCC上使用它? :)

目前我能想到的最简单的解决方案是使用预处理条件:

#ifndef __GNUC__
#pragma region
#endif

// Stuff...

#ifndef __GNUC__
#pragma endregion
#endif

虽然不太美观或易读,但可以让代码在GCC上编译时无警告。


1
@altendky 我不确定,因为它被 Visual Studio 编辑器用来表示可以折叠的区域。这取决于 Visual Studio 编辑器解析器的好坏。 - Some programmer dude
6
在宏的“替换列表”中,单个#(与##相对)并不表示预处理器指令,而是表示字符串化运算符。紧跟在#操作符后面的必须是宏参数名称。请注意,这里并没有其他含义。 - David Hammen
2
如果MSVC支持C99和C++11的_Pragma运算符,您可以有条件地定义一个宏为在使用MSVC时的_Pragma("region"),否则将其定义为空。 - Jonathan Wakely
1
坏主意。当我将一些东西包装在一个区域中时,这是为了我可以折叠它并将其移动到文件中的其他位置,并保持区域中的所有内容在一起。这就是整个意义所在。将其包装起来意味着移动它会在各处留下一些#ifndef和#endif代码的小碎片,并变成一团糟。 - Dan

5
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunknown-pragmas"
... Code using Unknown pragmas ...
#pragma GCC diagnostic pop

1
由于您也在Windows上构建,因此您可能希望将其包装在以下内容中:#ifdef GNUC - Eric
如果没有这个 bug,这将是最佳答案:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431。但事实上,解决方法似乎是使用核选项,在命令行上禁用未知的 pragma 警告:-Wno-unknown-pragmas。最终正确的答案是让 GCC 承认并正确处理区域:https://gcc.gnu.org/bugzilla//show_bug.cgi?id=85487。 - Jimbo1987
@Jimbo1987 嗯,最近似乎已经修复了。但是当然它在大多数当前的GCC版本中不起作用,但随着时间的推移,它将再次值得考虑。现在我选择使用“-Wno-unknown-pragmas”。对于我的代码来说,这已经足够了,但对于企业来说并不是真正的解决方案。 - Harry

5

这似乎是MSVC特有的编译指示符,因此您应该使用:

#ifdef _MSC_VER
#pragma region
#endif

<code here>

#ifdef _MSC_VER
#pragma endregion
#endif

1
但是你就无法在pragma区域之间折叠了! - Rui Monteiro

2
自从提出这个问题以来,编译器对#pragma region的支持已经有所改进。下表列出了支持此功能的编译器:
编译器 支持版本 msvc 未知 icc 未知 clang >= 6.0(所有目标平台)(早期版本在Windows上已经支持) gcc >= 13.0(bug 85487

把答案说清楚,告诉他们更新编译器。如果你要强调的话,包括精确的版本号,包括Clang。 - starball
我添加了一些信息,但是我不确定一些编译器何时添加支持此功能。请随意完成表格 :) - maxbachmann
1
不错的更新。如果能提供“官方”的信息链接就更好了。 - starball

0
如果你注释掉 #pragma region#pragma endregion 这两行代码,你的编辑器仍然可以解析它并使用折叠功能,而不会出现任何 gcc 发出的警告。

我已在 VSCode 1.70.2 上进行了测试,这个解决方法有效。

enter image description here


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