c89标准不应该是一致的吗?
我正在用gcc -W -Wall -std=c89 -pedantic -O3编译
在macOS上,gcc似乎是clang的别名:gcc --version返回Apple clang version 14.0.0 (clang-1400.0.29.201)。它没有给出关于powf的警告,并且程序的行为与预期的一样。
而在linux上,这才是真正的交易。它会给出所有预期的错误/警告,而不编译。
发布于 2022-10-28 18:45:22
我正在用-c89编译,而在Linux上我必须自己定义powf,但是在macOS上已经定义了。为什么会有区别?
C89标准库的规范包括一个带有参数的pow()函数,参数类型为double,返回double,但没有返回powf()函数。C99添加了powf()作为一个模拟,它接受float类型的参数并返回float。
不同机器的不同编译器在请求符合特定版本语言规范的模式下进行编译时,如何处理这些编译器。这就是你观察差异的真正原因。
但请注意,你所观察到的差异可能不是你认为你所观察到的差异。如果在C89模式下编译意味着math.h没有提供powf()声明,那么这并不意味着调用该函数的C89程序不会编译。相反,这类程序仍然应该编译,但它们对powf() 的调用将产生未定义的行为,可能是不正确的行为,这是因为实际上在系统库中存在的powf()函数没有一个签名,即在没有原型的情况下,C89处理器应该从对该函数的调用中推断出来。
不是c89标准应该是一致的吗?
C89标准是一个单一的文档。它必须是一致的。但是不同的编译器如何实现c89一致性模式是不一致的。
https://stackoverflow.com/questions/74239566
复制相似问题