You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重复声明带_Noreturn与不带该说明符的exit函数是否属于未定义行为?

关于exit函数声明的未定义行为分析

先看你给出的代码:

_Noreturn void exit(int status);
void exit(int status);

int main(void) {
    exit(0);
}

一、两次声明exit(带/不带_Noreturn)是否属于未定义行为?

是未定义行为。根据C标准(C17 §6.7.4/4):如果一个函数被声明为_Noreturn,那么所有对该函数的后续声明都必须包含_Noreturn说明符,否则行为未定义。反过来,若先声明不带_Noreturn再声明带的,同样违反函数声明的一致性要求——函数的多个声明必须在是否带有_Noreturn上保持一致,否则编译器无法确定该函数的行为属性(比如是否需要生成不处理返回的代码),因此属于未定义行为。

至于编译器未发出警告,可能是因为这类一致性检查的优先级较低,或者默认未开启相关警告(不同编译器的警告策略有差异,部分高阶警告组合如GCC的-Wall -Wextra可能触发类似提示,但并非所有编译器都会默认检测)。

二、仅声明不带_Noreturn的exit是否属于未定义行为?

同样是未定义行为。C标准明确规定exit函数的标准声明带有_Noreturn(C17 §7.22.4.4/1)。根据C标准(C17 §7.1.4/2):如果程序声明了一个标准库函数的类型,与标准中规定的类型不兼容,那么行为未定义。你自行声明的void exit(int)与标准库的_Noreturn void exit(int)类型不兼容,因为缺少_Noreturn说明符,这可能导致编译器生成不符合预期的代码(比如保留处理函数返回的逻辑),因此属于未定义行为。

内容的提问来源于stack exchange,提问作者Joseph Sible-Reinstate Monica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:46:05