我正在尝试使用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
,但那有多糟糕?我花了几个小时寻找这些答案,但没有成功。
如何在不使编译器呕吐的情况下将指针传递给结构?
答案 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
}