1

我知道我可以像这样使用结构数组作为函数参数

创建一个结构

struct number{
    int times;
    char numptr;
}numList[MAXNUM];

并创建一个函数

void transform(int i, struct number *L){......}

将结构数组传递给函数

transform(i, numList);

但是为什么我可以通过 VC 成功编译它,而不知何故无法通过 gcc 编译它?我使用代码块,它的编译器是 gcc,它的部分错误在这里

warning: 'struct number' declared inside parameter list [enabled by default]|
warning: its scope is only this definition or declaration, which is probably not what you want[enabled by default]|
warning: passing argument 2 of 'transform' from incompatible pointer type [enabled by default]|
note: expected 'struct number *' but argument is of type 'struct number *'|
error: conflicting types for 'transform'|
4

1 回答 1

1

请注意,问题可能只是订购问题。以下是 SSCCE 的两个示例(简短、独立、正确的示例),一个显示您的问题,一个未显示您的问题。两者之间的区别在于函数声明出现在源代码中的位置——在定义之前或之后struct number

干净编译

#include <stdio.h>

enum { MAXNUM = 3 };

struct number{
    int times;
    char numptr;
}numList[MAXNUM];

void transform(int i, struct number *L);

extern void function(void);

void function(void)
{
    int i = 3;
    transform(3, numList);
    for (int j = 0; j < i; j++)
        printf("%c: %d\n", numList[j].numptr, numList[j].times);
}

$ gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -c vc1.c
$

包括警告

#include <stdio.h>

void transform(int i, struct number *L);

extern void function(void);

enum { MAXNUM = 3 };

struct number{
    int times;
    char numptr;
}numList[MAXNUM];

void function(void)
{
    int i = 3;
    transform(3, numList);
    for (int j = 0; j < i; j++)
        printf("%c: %d\n", numList[j].numptr, numList[j].times);
}

汇编:

$ gcc -O3   -g      -std=c99   -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition     -c vc2.c
vc2.c:3:30: warning: ‘struct number’ declared inside parameter list [enabled by default]
vc2.c:3:30: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
vc2.c: In function ‘function’:
vc2.c:17:5: warning: passing argument 2 of ‘transform’ from incompatible pointer type [enabled by default]
vc2.c:3:6: note: expected ‘struct number *’ but argument is of type ‘struct number *’
$

struct number;您可以通过在之后#include(或者,实际上,在它之前)添加一行来修复第二个示例。或者通过将 的定义struct number移到void transform(int i, struct number *L);. transform()如果您有两个源文件,一个定义函数,一个单独使用它,则更容易遇到此问题。那是您开始使用标头的时候——它们可用于提供不同文件之间的一致性检查。

编译器:Mac OS X 10.7.5 上的 GCC 4.7.1。

于 2013-04-20T17:45:48.477 回答