[英]Function header/declaration
这是我的主要功能,也是我要传递的内容。
int main(void){
struct can elC[7]; // Create an array of stucts
Initialize(elC); // initializes the array
return 0;
}
int Initialize(struct can elC[7]){
}
在C语言中,我们不必在main或其他东西之前声明函数吗? 如果是这样,它将如何? 我的代码运行良好,声明为
int Initialize();
但是我不需要
int Initialize(struct can elc[7]);
/* Declaration of Structure */
struct can {
/* Structure members */
};
/* Function Prototype - ANY OF THE THREE */
int Initialize();
int Initialize(struct can []);
int Initialize(struct can var[]);
int main (void)
{
struct can elC[7]; // Create an array of stucts
Initialize(elC); // Call to function - Initializes the array
return 0;
}
int Initialize(struct can elC[7])
{
//Do something;
return 0;
}
如果不声明原型会怎样?
以下将正常工作。
$ gcc filename.c
当与-Wall
选项结合使用时,会发出警告。
$ gcc filename.c -Wall
In function ‘main’:
Warning: implicit declaration of function ‘Initialize’ [-Wimplicit-function-declaration]
因此,总是最好在main
之前声明原型
int Initialize(struct can []);
要么
int Initialize(struct can var[]);
以下也是有效的,表示您可以传递任意数量的参数。 看这里 。
int Initialize();
在C89中,您不必在调用函数之前先声明它; 但是,如果您确实调用了一个未声明的函数,则就像您将该函数声明为:
int funcname();
空括号并不表示该函数不带参数。 这仅仅意味着我们的声明不是原型 。 在此阶段,参数的数量和类型是未知的(但它不是像printf()
这样的带有可变参数列表的printf()
因为即使在C89中,使用它们时,它们的作用域也必须是原型)。
如果实际函数返回的不是int
,或者使用错误的类型或数量的参数调用它,或者在应用默认参数提升后任何参数的类型不同,则调用该函数会导致未定义的行为。
您的代码不会受到任何这些限制的影响,因此您的代码在C89中是正确的。 但是,无论如何都使用函数原型被认为是一种很好的样式,因为它使编译器能够检测所有这些情况并报告错误。
在C99中,必须在调用函数之前先声明它。 合适的原型将是:
int Initialize(struct can *elC);
如果您的编译器支持,我也建议您使用C99或C11。 关于在功能参数列表中使用[]
, 请参见此处 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.