繁体   English   中英

函数头/声明

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM