我知道我可以像这样使用struct array作为函数参数
创建一个结构
struct number{
int times;
char numptr;
}numList[MAXNUM];
并创建一个函数
void transform(int i, struct number *L){......}
将struct数组传递给函数
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'|
答案 0 :(得分:1)
请注意,问题可能仅仅是订购问题。以下是SSCCE(Short, Self-Contained, Correct Example)的两个示例,一个显示您的问题,一个没有显示您的问题。两者之间的区别在于函数声明出现在源中 - 在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。