如何在不激怒编译器的情况下将指针传递给结构?

时间:2013-05-22 06:49:40

标签: c++ reference struct mingw structure

我正在尝试使用MinGW 4.7.2编译一个简单的C ++程序,但是由于大量的错误和警告而感到沮丧。

/*\ program.h \*/
typedef struct
{   int member0;
    int member1;
    int member2;
    int member3;
} structure;

void function(&structure);

/*\ program.cpp \*/
#include "program.h"

int main(void)
{   structure *instance;
    function(instance);
}

void function(&structure)
{   // nothing
}

function获取structure的地址。指针instance包含structure的地址,然后传递给function

简单,但编译器不满意。

g++ program.cpp
In file included from program.cpp:1:0:
program.h:8:14: error: variable or field 'function' declared void
program.h:8:25: error: expected primary-expression before ')' token
program.cpp: In function 'int main()':
program.cpp:5:19: error: 'function' was not declared in this scope
program.cpp: At global scope:
program.cpp:8:14: error: variable or field 'function' declared void
program.cpp:8:25: error: expected primary-expression before ')' token

variable or field 'function' declared void试图告诉我什么? function显然是void,但那有多糟糕?我花了几个小时寻找这些答案,但没有成功。

如何在不使编译器呕吐的情况下将指针传递给结构?

3 个答案:

答案 0 :(得分:5)

而不是这个(参见我在代码中的评论......几乎是编译器告诉你的):

/*\ program.h \*/
typedef struct
{   int member0;
    int member1;
    int member2;
    int member3;
} structure;

void function(&structure);

/*\ program.cpp \*/
#include "program.h"

int main(void)
{   structure *instance; // this is not an instance. it is a pointer

    function(instance);
}

void function(&structure) // this is an invalid declaration
{   // nothing
}

这样做:

/*\ program.h \*/
struct structure
{   int member0;
    int member1;
    int member2;
    int member3;
};

void function(structure& s); // parameter 's' is a reference to your structure

/*\ program.cpp \*/
#include "program.h"

int main(void)
{   structure instance; // this is an instance

    function(instance);
}

void function(structure& s) 
{   // nothing
}

您需要了解实例,指针和引用之间的差异......并且还要知道每个是否声明变量或函数接口的有效语法。

或者,您可以将指针传递给您的实例,如下所示:

/*\ program.h \*/
struct structure
{   int member0;
    int member1;
    int member2;
    int member3;
};

void function(structure* p);

/*\ program.cpp \*/
#include "program.h"

int main(void)
{   structure instance; // you still need an instance to point to

    function(&instance); // this passes the address of the instance into the function
}

void function(structure* p)
{   // nothing
}

是否使用引用或指针取决于您要执行的操作。 您还应该考虑使用const来更清楚地说明您的函数是否会修改结构的内容,还可以帮助编译器优化代码。

最后,从最上面的一个开始一次修复一个错误。通常,第一个和后续错误在第一个错误修复后会改变(或消失)。

答案 1 :(得分:1)

/*\ program.cpp \*/
#include "program.h"
void function(structure*);

int main(void)
{   structure instance;
    function(&instance);
}

void function(structure*)
{   // nothing
}

答案 2 :(得分:1)

您不希望/需要使用typedef在C ++中声明结构,并且您的函数应该接受指向它们的指针 - 表示为Structure* ...

/*\ program.h \*/
struct Structure
{   int member0;
    int member1;
    int member2;
    int member3;
};

void function(Structure*);

你的程序只是进行相同的小改动来传递/期望一个指针。 (main(void)是一个C事物 - 只有main()对C ++来说已经足够了)

/*\ program.cpp \*/
#include "program.h"

int main()
{
    Structure* instance;
    function(instance);
}

void function(Structure*)
{   // nothing
}