我正在关注此example,我的程序如下:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct Foo
{
int x;
int array[100];
};
struct Foo f;
f.x = 54;
f.array[3]=9;
void print(void){
printf("%u", f.x);
}
int main(){
print();
}
但是,使用make example_1
编译时出现错误:
example_1.c:13:1: error: unknown type name 'f'
f.x = 54;
^
example_1.c:13:2: error: expected identifier or '('
f.x = 54;
^
example_1.c:14:1: error: unknown type name 'f'
f.array[3]=9;
^
example_1.c:14:2: error: expected identifier or '('
f.array[3]=9;
^
4 errors generated.
make: *** [example_1] Error 1
这个struct声明有什么问题?
答案 0 :(得分:6)
f.x = 54;
f.array[3]=9;
应该在一些功能里面。除了初始化之外,您不能在全局范围内编写函数外的程序流。
要全局初始化,请使用
struct Foo f = {54, {0, 0, 0, 9}};
在C99中,你也可以写
struct Foo f = {.x=54, .array[3] = 9 };
您提到的示例链接说:
struct Foo f; //自动分配,所有字段都放在堆栈上
f.x = 54;
{
{1}}
使用文字堆栈表明它开始在如下的本地函数中使用:
f.array[3]=9;
答案 1 :(得分:2)
您只能在其变形点处初始化结构变量。
您可以像这样初始化它:
struct Foo f = {54, {0, 0, 0 9}};
或使用C99功能designated initializers
:
struct Foo f = {.x = 54, .array[3] = 9};
第二种方法是更清晰但不幸的是C99并不像C89那样广泛使用。 GNU编译器完全支持C99。 Microsoft的编译器不支持C89以上的任何C标准。 C ++也没有这个功能。
因此,如果您希望使用C ++编译器或Microsofts C编译器编译代码,则应使用第一个版本。如果您仅仅为gcc编写代码而不是微软的开发工具,那么您可以使用第二个版本。
您还可以在函数中单独指定每个成员:
void function(void)
{
f.x = 54;
f.array[3] = 9;
}
但你不可能全球化。