2014-09-12 115 views
0

我下面這個example,我的計劃是這樣的:如何在c中聲明結構?

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 

這有什麼聲明結構的問題:

#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編譯時收到錯誤?

+6

您無法在函數之外編寫可執行代碼。把3行'struct Foo f; ...在main()裏面的f.array [3] = 9'。 – clcto 2014-09-12 13:57:32

回答

6
f.x = 54; 
f.array[3]=9; 

應該在一些函數裏面。除了初始化之外,您不能在全局範圍內寫入程序流。

要全局初始化,使用

struct Foo f = {54, {0, 0, 0, 9}}; 

live code here

在C99中,你也可以寫

struct Foo f = {.x=54, .array[3] = 9 }; 

live code here


您提到的示例鏈接說:

struct Foo f; //自動分配,所有字段放在
f.x = 54;
f.array[3]=9;

字堆棧的使用表明,它是一個局部函數內使用開始象下面這樣:

void bar() 
{ 
    struct Foo f; 
    f.x = 54; 
    f.array[3]=9; 
    do_something_with(f); 
} 

live example here

2

您只能在其刪除的位置初始化一個結構變量。

您可以像這樣初始化:

struct Foo f = {54, {0, 0, 0 9}}; 

或使用C99功能designated initializers

struct Foo f = {.x = 54, .array[3] = 9}; 

做到這一點是很多更清晰但不幸的是C99並不像廣泛使用的第二種方法作爲C89。 GNU編譯器完全支持C99。微軟的編譯器不支持C89之上的任何C標準。 C++也沒有這個功能。

所以,如果你想用C++編譯器或Microsofts C編譯器編譯代碼,你應該使用第一個版本。如果您純粹爲gcc編寫代碼,並且不太瞭解Microsoft的開發工具,則可以使用第二個版本。

您也可以在功能單獨爲每個成員分配:

void function(void) 
{ 
    f.x = 54; 
    f.array[3] = 9; 
} 

但你不能做到這一點globably。

+0

當我開始寫這篇文章的時候,其他的答案並沒有提示'指定的初始化器'。我發佈後,我注意到其他答案已編輯,包括這一點。這個答案現在看起來多餘。我不知道該怎麼辦。 – wefwefa3 2014-09-12 14:35:31