如何为一段代码启用 -permissive
How to enable -fpermissive for a section of code
我有一个 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
相关文章:
- 如何为一段代码启用 -permissive
- 使用Qt Creator在调试模式下编译一段代码
- 防止一段代码在协程中并发执行
- 通过创建单个线程来运行一段代码可加快执行速度
- 有没有一种标准方法来确保一段代码在全局范围内执行
- C++函数 Sleep() 在一段代码之前执行
- C++中的继承和模板:为什么以下一段代码不编译?
- 一段C++代码出现错误"invalid pointer"
- 我必须编写一段代码,基本上执行c++中的strlen()函数,哪里出了问题
- 关于行列式计算的一段代码的问题
- 将两个或多个互斥体应用于一段代码
- 使类使用浮点数和整数(分析一段代码)
- 如何在C++中编写一段代码以查找系统路径上文件的完整路径
- 从第二次调用开始在函数中执行一段代码
- 将一段C++代码封装到Python中
- 解释一段c++代码
- 了解CHIP8模拟器中的一段代码
- 将一段代码从c++转换为c#
- 如何只执行一段代码一次
- 如何对依赖于Asio的一段代码进行单元测试