关于struct array作为由gcc和vc编译的参数

时间:2013-04-20 16:58:06

标签: c parameters struct

我知道我可以像这样使用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'|

1 个答案:

答案 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。