为什么clang c89有powf,而gcc c89没有?[已关闭]

xfb7svmp  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(182)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
14天前关闭。
此帖子已在14天前编辑并提交审核,未能重新打开:
原始关闭原因未解决
Improve this question
c89标准不应该是一致的吗?
我用gcc -W -Wall -std=c89 -pedantic -O3编译
在macOS上,gccclang的别名:gcc --version返回Apple clang version 14.0.0 (clang-1400.0.29.201)。它不给出关于powf的警告,并且程序的行为符合预期。
而在linux上,这是真实的的交易,它给出了所有预期的错误/警告,并且不编译。

nmpmafwu

nmpmafwu1#

我用-c89编译,在Linux上我必须自己定义powf,但在macOS上它已经定义好了,为什么会有区别呢?
C89标准库的规范包括一个pow()函数,它的参数类型为double,返回double,但没有powf()函数。C99添加了powf()作为一个模拟函数,它接受float类型的参数,并返回float
不同机器上的不同编译器如何处理这种情况,当被要求在一种要求符合特定版本的语言规范的模式下编译时,这是这些编译器所特有的。这就是关于 * 为什么 * 你会观察到差异的真正原因。
但是请注意,您观察到的差异可能并不是您 * 认为 * 您观察到的差异。如果在C89模式下编译意味着math.h没有提供powf()的声明,那么这并不意味着调用该函数的C89程序将无法编译。相反,这样的程序仍然可以编译,但是***它们对powf()的调用将产生未定义的行为***。可能是不正确的行为,因为powf()函数实际上存在于系统库中,但没有C89处理器在范围内没有原型时从对该函数的调用中推断出的签名。
c89标准不应该是一致的吗?
C89标准是一个单一的文档。它不可能不一致。但是不同的编译器如何实现c89一致性模式是不一致的。

相关问题