C - 通过引用传递struct

时间:2017-01-26 22:28:23

标签: 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);

}

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

2 个答案:

答案 0 :(得分:6)

这全部由

引起
#define MyStruct

使用此行,您已将MyStruct定义为扩展为空的宏。即您已经在以下代码中有效地删除了所有出现的MyStruct,这就是为什么编译器对于看到像

这样的事情感到困惑的原因
typedef struct {

    int value;

} ;

void changeData( data);

要解决此问题,请使用

#ifndef MYFUNCTIONS_H_
#define MYFUNCTIONS_H_

代替。 (这就是我们为宏使用ALL_UPPERCASE名称的原因:为了避免使用普通标识符进行意外名称冲突。)

答案 1 :(得分:0)

应用我的所有评论并删除不必要的&#39; typedef&#39;,并将其全部放在一个文件中(注意:提取各种文件没有问题),结果如下:

#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

干净地编译并执行所需的操作