|
|
1
31
在严格的遵从模式下(这在理论上意味着“在理论上”),当您调用一个函数时,如果该函数接受的参数数目可变,并且在范围内没有函数的原型声明,则会调用未定义的行为(这很糟糕)。这意味着编译器可以对使用
在实践中,即使没有
正如qrdl所指出的,找到这个函数是因为C编译器链接到C库。 注意,Chris Young关于c99和“implicit int”的评论是准确的,但是关于“variable arguments functions must have a prototype in scope”的规则适用于c89和c99。默认情况下,大多数编译器不在严格的C99兼容模式下工作,因为有太多的代码无法这样编译。 克里斯·杨评论道:
克里斯当然是对的。从C99标准中删除了两个“隐式声明”功能。标准前言将其列为:
我想得不够清楚(因此也写不清楚)。然而,C89和C99都需要一个范围内的原型,用于接受可变数量参数的函数。 举例说明:
如果没有第一行,这是一个正确的c89片段,带有函数的隐式声明
|
|
|
2
37
您最初标记了这个C++,但是它看起来是一个C程序。如果作用域中没有原型(例如由于省略了include<stdio.h>),C将自动为函数提供隐式声明。隐式声明将是:
这意味着printf是一个返回int的函数,可以接受任意数量的参数。这个原型正好适合你的电话。您应该包括<stdio.h> 最后,我应该补充一下,当前的C标准(ISO/IEC 9899:1999或通俗地说“C99”)是这样的 不 允许隐式声明,此程序将不符合。隐式声明已删除。我相信您的编译器不支持C99。C++还需要正确的原型,不做隐式声明。 |
|
3
9
如果不包含适当的头,则会导致使用未原型化的函数,从而导致问题,因为C编译器假定该函数没有原型返回
|
|
|
Daniel Viaño · 将函数移动到不同的文件 8 年前 |
|
|
Trojax · 编译多个。c和。h文件 8 年前 |
|
Stevoisiak · 为什么#包含打破全局变量? 8 年前 |
|
|
jaxonjma · 在另一个JSP中动态发送并包含JSP 8 年前 |