重复声明带_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
相关产品推荐
相关产品推荐

