The*_*Egg 0 c struct pass-by-reference
我试图在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);
}
Run Code Online (Sandbox Code Playgroud)
myfunctions.c
#include "structures.h"
void changeData(MyStruct data) {
data.value = 7;
}
Run Code Online (Sandbox Code Playgroud)
myfunctions.h
#ifndef MyStruct
#define MyStruct
void changeData(MyStruct data);
#endif
Run Code Online (Sandbox Code Playgroud)
structures.h
typedef struct {
int value;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
产生的错误
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
Run Code Online (Sandbox Code Playgroud)
这都是由于
#define MyStruct
Run Code Online (Sandbox Code Playgroud)
使用此行,您已定义MyStruct为扩展为空的宏.也就是说,你已经有效地删除MyStruct了以下代码中出现的所有内容,这就是为什么编译器在看到类似内容时会如此困惑
typedef struct {
int value;
} ;
Run Code Online (Sandbox Code Playgroud)
要么
void changeData( data);
Run Code Online (Sandbox Code Playgroud)
要解决此问题,请使用
#ifndef MYFUNCTIONS_H_
#define MYFUNCTIONS_H_
Run Code Online (Sandbox Code Playgroud)
代替.(这就是我们ALL_UPPERCASE为宏使用名称的原因:避免使用普通标识符进行意外名称冲突.)
| 归档时间: |
|
| 查看次数: |
1465 次 |
| 最近记录: |