2017-01-26 232 views
0

我想通過引用在C中傳遞一個結構,以便我可以修改函數內的值。這是迄今爲止的代碼,但它會產生一些警告和一個錯誤。C - 通過引用傳遞結構

的main.c

#include <stdio.h> 
#include "myfunctions.h" 
#include "structures.h" 

int main(int argc, char const *argv[] { 

    struct MyStruct data; 

    data.value = 6; 

    printf("Before change: %d\n", data.value); 

    changeData(data); 

    printf("After change: %d\n", data.value); 

} 

myfunctions.c

#include "structures.h" 

void changeData(MyStruct data) { 
    data.value = 7; 
} 

myfunctions.h

#ifndef MyStruct 
#define MyStruct 

void changeData(MyStruct data); 

#endif 

structures.h

typedef struct { 

    int value; 

} MyStruct; 

個錯誤生產

In file included from main.c:2:0: 
myfunctions.h:4:1: warning: parameter names (without types) in function declaration 
void changeData(MyStruct data); 
^ 
In file included from main.c:3:0: 
structures.h:5:1: warning: unnamed struct/union that defines no instances 
} MyStruct; 
^ 
main.c: In function ‘main’: 
main.c:9:5: error: ‘data’ undeclared (first use in this function) 
    data.value = 6; 
    ^
main.c:9:5: note: each undeclared identifier is reported only once for each function it appears in 
+1

'空隙changeData(MYSTRUCT *數據)'和'changeData( &數據)' –

+0

如果你想傳遞一個指向結構的指針,你需要明確地做到這一點。 –

+0

確保您在頁面右側檢查** Related **。你的頭銜出現很多次。 –

回答

6

這一切造成

#define MyStruct 

這條線,你已經定義MyStruct爲擴展到任何一個宏。即你有效去除的MyStruct所有出現在下面的代碼,這就是爲什麼編譯器是如此的困惑看到這樣

typedef struct { 

    int value; 

} ; 

void changeData(data); 

事情要解決這個問題,使用

#ifndef MYFUNCTIONS_H_ 
#define MYFUNCTIONS_H_ 

改爲。 (這就是爲什麼我們使用宏名稱爲ALL_UPPERCASE的原因:爲了避免意外的名稱與正常標識符的衝突。)

0

應用我所有的註釋並消除不必要的'typedef',並將它放在一個文件中(注意:存在與提取的各種文件),結果在下面的代碼沒有問題:

#ifndef STRUCTURES_H 
#define STRUCTURES_H 

struct MyStruct 
{ 
    int value; 
}; 
#endif // STRUCTURES_H 



#ifndef MYFUNCTIONS_H 
#define MYFUNCTIONS_H 

void changeData(struct MyStruct *data); 

#endif // MYFUNCTIONS_H 





#include <stdio.h> 
//#include "myfunctions.h" 
//#include "structures.h" 

int main(void) 
{ 
    struct MyStruct data; 

    data.value = 6; 

    printf("Before change: %d\n", data.value); 

    changeData(&data); 

    printf("After change: %d\n", data.value); 
} // end function: main 



//#include "structures.h" 

void changeData(struct MyStruct *data) 
{ 
    data->value = 7; 
} // end function: changeData 

其完全編譯並執行執行期望的操作