通过函数传递struct时收到警告

时间:2017-12-26 10:42:47

标签: c function struct typedef

我试图通过值传递整个结构,并通过在传递的结构中显示变量来测试传递是否成功。

当我编译并运行程序时,变量显示正确,但我收到警告:

  

警告:函数声明中的参数名称(无类型)

所以它引用了使用没有类型的参数名称声明的函数原型?但如果我正确地宣布了这个功能,为什么我会收到这个警告?

另外,在我写的测试中的短程序中,警告并不会影响显示的输出是正确的。

但是如果我在编写更大规模的程序时在相同的情况下(通过函数传递struct)得到这个警告,它会影响该程序中的输出是否正确?

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void pass(Info);

typedef struct {
    char str[10];
    int num;
} Info;

void main() {
    Info i;

    strcpy(i.str, "Hello!");
    i.num = 1;

    pass(i);
}

void pass(Info i) {
    printf("%s\n", i.str);
    printf("%d\n", i.num);
}

输出:

  

您好!

     

1

3 个答案:

答案 0 :(得分:3)

在使用新定义的类型之后,你有typedef语句另一种类型的同义词,是挑剔的)。此时,在函数转发声明中,编译器不知道名为Info的类型。因此,它假定它是一个变量名。

在函数原型之前移动typedef

也就是说,void main()不是托管环境中main()的有效签名。它至少应为int main(void)

答案 1 :(得分:1)

因为您在声明Info结构之前声明了函数原型。

替代方案可以是以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct 
{
    char str[10];
    int num;
} Info;

void pass(Info);

void main() 
{
      Info i;

      strcpy(i.str, "Hello!");
      i.num = 1;
      pass(i)
}

void pass(Info i) 
{
     printf("%s\n", i.str);
     printf("%d\n", i.num);
}

答案 2 :(得分:1)

编译器会考虑此函数声明

void pass(Info);

作为带有标识符列表的函数声明。这就是Info是参数的标识符,而不是它的类型。

但是根据C标准(6.7.6.3函数声明符(包括原型)):

  

3 函数声明符中的标识符列表,它不是a的一部分   该函数的定义应为空

因此,编译器会发出一个警告,指出标识符列表对于非函数定义的函数声明不为空。

warning: parameter names (without types) in function declaration

要么你应该写

void pass();

或者你应该在函数声明之前放置结构声明的typedef,在这种情况下,名称Info将表示一个类型。