如何为一段代码启用 -permissive

How to enable -fpermissive for a section of code

本文关键字:一段 代码 启用 -permissive      更新时间:2023-10-16

我有一个 C 单头库,我想在我的C++项目中使用它。通常,我只会包含文件,这很好C++因为它几乎是 C 的超集。但是,此库具有跳过初始化的goto,违反了C++标准。

我可以通过在 GCC 上启用-fpermissive编译器标志来解决这个问题,但我希望错误能够为我的其余代码正确触发。

有没有办法只为这个头文件启用它(可能类似于#pragma GCC diagnostic XXX(。

#pragma GCC optimize "blah"或函数属性__attribute__((optimize("blah")))就像为该文件的其余部分/该特定函数给出的参数-fblah,但它似乎不适用于-fpermissive

$ cat foo.cpp
#pragma GCC optimize "permissive"
void foo(int x) {
}
$ g++-8 -c -Wall -Wextra foo.cpp
foo.cpp:1:22: warning: bad option ‘-fpermissive’ to pragma ‘optimize’ [-Wpragmas]
#pragma GCC optimize "permissive"
^~~~~~~~~~~~
foo.cpp:3:16: warning: bad option ‘-fpermissive’ to attribute ‘optimize’ [-Wattributes]
void foo(int x) {

一种选择是将需要它的函数单独放在一个文件中,并将构建系统配置为仅使用-fpermissive编译该文件,尽管这会破坏仅标头模型。或者修复代码,使其根本不需要该选项。

每个 gcc 手册页:

-允许

将有关不符合代码的某些诊断从错误降级为警告。 因此,使用 -fpermissive 允许编译一些不符合标准的代码。

因此,从理论上讲,可以使用一系列 gcc 警告编译指示将一个部分编译为宽松部分:


//  Start permissive code
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-result"
#pragma GCC diagnostic ignored "-Wuninitialized"
// .. Other #pragmas
// Permissive Code here.
// Restore normal processing.
#pragma GCC diagnostic pop

一个挑战是没有已发布的错误列表将被-fpermissive忽略(至少我找不到它(。一种可能的方法是编译代码,一次输入一个 #pragma,直到代码干净地编译。

如果可以识别所有(或大部分(规则,则可以将它们放入 #include 文件中。

#pragma GCC diagostic push
#include "permissive.h"
// Permissive Code here
#pragma GCC diagostic pop