我试图在C中通过引用传递结构,以便我可以修改函数内的值.这是我到目前为止的代码,但它会产生一些警告和一个错误.
main.c中
#include#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
melpomene.. 6
这都是由于
#define MyStruct
使用此行,您已定义MyStruct
为扩展为空的宏.也就是说,你已经有效地删除MyStruct
了以下代码中出现的所有内容,这就是为什么编译器在看到类似内容时会如此困惑
typedef struct { int value; } ;
要么
void changeData( data);
要解决此问题,请使用
#ifndef MYFUNCTIONS_H_ #define MYFUNCTIONS_H_
代替.(这就是我们ALL_UPPERCASE
为宏使用名称的原因:避免使用普通标识符进行意外名称冲突.)
这都是由于
#define MyStruct
使用此行,您已定义MyStruct
为扩展为空的宏.也就是说,你已经有效地删除MyStruct
了以下代码中出现的所有内容,这就是为什么编译器在看到类似内容时会如此困惑
typedef struct { int value; } ;
要么
void changeData( data);
要解决此问题,请使用
#ifndef MYFUNCTIONS_H_ #define MYFUNCTIONS_H_
代替.(这就是我们ALL_UPPERCASE
为宏使用名称的原因:避免使用普通标识符进行意外名称冲突.)