我读了C标准的默认论点晋升,并在许多问题上感到困惑。This问题以恰当的方式显示了我对其有疑问的所有段落。
首先,在第6段第3点中,它说如果原型以省略号结尾,则行为是未定义的。现在我怀疑的是,如果我们谈论printf,它的原型也以省略结束,但它的行为不是没有定义的,实际上它遵循了第6段的第1点。标准在这里试图解释什么?而且,如果升级后的参数类型与参数的类型不兼容,则行为是未定义的。现在,我怀疑如果参数已经在函数原型中声明了,为什么首先要提升参数。
第6段第4点指出,晋升后的论点类型与晋升后的参数类型不一致,行为不明确。正如这里提到的,这个函数没有一个原型,那么确切地说他们谈论的是哪些参数呢?以及如何提升参数。我只研究过辩论晋升。
与第7段第1点相比,这一行意味着什么:将每个参数的类型作为其声明类型的不合格版本。
我真的很难理解这一切。如果你能用一个一个的例子来解释所有的要点,那将是非常有帮助的。我不是以英语为母语的人,如果我误解了一些标准的观点,请指出错误。
发布于 2020-05-15 20:42:04
在C 1999条款6.5.2.2第6段中,该问题中标记为3的项将被标记为1:如果调用表达式使用没有原型的类型,而调用的函数使用以省略号结尾的原型定义,或者提升的参数类型与参数类型不兼容,则行为是未定义的。
这并不是说您不能使用省略号,只是在调用函数的表达式中使用的函数类型与用于定义函数的函数类型之间可能存在冲突。
示例:
C文件包含:
void foo(); // No prototype (parameter types are not declared).
int main(void)
{
foo(3, 4);
}C文件功能包含:
void foo(int x,...) // Prototype (parameter types are declared) and has ellipsis.
{
}行为是未定义的,因为foo被调用时就像它是void foo()一样,但是它是用void foo(int x,...)定义的。这种不匹配在现代实践中不应该发生,因为在没有原型的情况下声明函数是老式的。它在C中仍然受支持,所以旧的源代码仍然可以编译,但是新的源代码不应该使用它。只要总是在函数声明和函数定义中声明参数类型,那么这种情况就不会发生。
在第7段中,“接受每个参数的类型为其声明类型的不合格版本”意味着忽略限定符(const、volatile、restrict或_Atomic)。这意味着可以为一个int参数传递一个const int参数,依此类推。
https://stackoverflow.com/questions/61827752
复制相似问题