请注意,问题可能只是订购问题。以下是 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。