2017-01-26 235 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 

其完全编译并执行执行期望的操作