函数头/声明

时间:2014-09-04 01:54:07

标签: c function struct

这是我的主要功能和我传递的内容。

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]);

2 个答案:

答案 0 :(得分:0)

/* 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[]);

下面也是有效的,意味着你可以传递任意数量的参数。见here

int Initialize();   

答案 1 :(得分:0)

在C89中,你不必在调用它之前声明一个函数;但是,如果您调用未声明的函数,就好像您将函数声明为:

int funcname();

空括号并不意味着该函数不带参数;它只是意味着我们的声明不是原型。在这个阶段,参数的数量和类型是未知的(但它不是采用像printf()那样的可变参数列表,因为即使在C89中,那些必须具有原型使用范围时。)

如果实际函数返回int以外的其他函数,或者使用错误类型或参数数量调用它,或者在应用默认参数促销后任何参数具有不同类型,则调用该函数导致未定义的行为。

您的代码不会受到任何这些限制的影响,因此您的代码在C89中是正确的。然而,无论如何它都被认为是好的风格,因为它使编译器能够检测所有这些条件并报告错误。

在C99中,您必须在调用之前声明该函数。一个合适的原型将是:

int Initialize(struct can *elC);

如果您的编译器支持,我建议使用C99或C11。关于在函数参数列表see here中使用[]