如何停止';诺雷顿';功能禁用'-Wreturn类型';GCC警告?

如何停止';诺雷顿';功能禁用'-Wreturn类型';GCC警告?,gcc,abort,noreturn,Gcc,Abort,Noreturn,当使用可能扩展为具有noreturn属性的函数的宏时,是否有方法阻止它抑制-Wreturn类型 简单的例子: /*在单独的标题中定义*/ #ifndef NDEBUG #定义我的断言宏(test)((void)((test)?0:abort()) #否则 #定义我的断言宏(测试)((无效)(0?0:(测试))) #恩迪夫 /*C源文件*/ int函数(枚举MyEnum foo) { 开关(foo){ 案例A:返回1; 案例B:返回1; } 我的_断言_宏(0); /*一个明显的方法是通过使用-D

当使用可能扩展为具有
noreturn
属性的函数的宏时,是否有方法阻止它抑制
-Wreturn类型

简单的例子:

/*在单独的标题中定义*/
#ifndef NDEBUG
#定义我的断言宏(test)((void)((test)?0:abort())
#否则
#定义我的断言宏(测试)((无效)(0?0:(测试)))
#恩迪夫
/*C源文件*/
int函数(枚举MyEnum foo)
{
开关(foo){
案例A:返回1;
案例B:返回1;
}
我的_断言_宏(0);

/*一个明显的方法是通过使用
-D\uu noreturn\uuu=-fno builtin abort
编译,简单地禁用
abort
上的noreturn属性。您还可以使用自定义包装器:

#include <stdlib.h>

#include <signal.h>
void myabort() {
    raise(SIGABRT);
}

#define abort() myabort()
#包括
#包括
void myabort(){
升起(SIGABRT);
}
#定义中止()myabort())
并使用
-include myabort.h
进行编译


但我建议不要这样做,而是在CI和/或预提交挂钩中的
-Wall-Werror
下发布版本。发布版本可能会发出有用的警告,原因有很多,例如,因为启用了
\u FORTIFY\u SOURCE
静态检查,或者在
assert
中使用的一些变量变得未使用。因此,可以绕过
abort
无法解决调试/发布不一致的问题。

只编写自己的
my_abort()
函数调用
abort()怎么样
并且没有声明
noreturn
,而是让您的宏调用它?使用实函数的问题是,它会使跨大型代码库的链接复杂化。您可以在标头中定义它,并使其
为静态
,这样每个模块都会得到一个副本。如果编译器开始注意到它调用
abort()
因此无法返回,请将其标记为
\uuuuu属性((noipa))
-D\uu noreturn\uuuuuuu=
在技术上是不可定义的行为吗?@JosephSible,为什么?
\uuuuu noreturn\uuuuuu
\uuu属性\uuuuuuuuuu>甚至都不是C标准的一部分。因为任何以两个下划线开头的都是保留的,而定义任何保留的都是UB。@JosephSible,我认为你是对的但正如我所说,我反对无论如何禁用
中止
的想法。提议的解决方案无论如何都是黑客,不管有没有UB,黑客都是坏的。