gcc 4.9的结构指针变量的外部未编译,我获得了未定义的引用。
这是密码
gvars.h
#include <structsource.h> //houses the struct definition of newType
extern struct newType *myvars;
main.c
#include <structsource.h>
#include "gvars.h"
int main(int x){
struct newType *myvars = myvalue;
return 0;
}
other.c
#include <structsource.h>
#include <others.h> //houses definition of others_func();
#include "gvars.h"
int otherfunc(){
others_func(myvars);
}
这是它的工作方式。首先,将结构变量myvars
填充为myvalue
。然后,我想使其也可用于其他c文件。但是,这不能编译,我得到undefined reference to 'myvars
解决此问题的最佳方法是什么?
PS。请耐心等待,因为我仍在学习c,这个外部结构对我来说是新的。
答案 0 :(得分:2)
int main(int myvalue){
struct newType *myvars = myvalue;
return 0;
}
myvars 是局部变量,而不是全局变量
但是
extern struct newType *myvars;
说全局变量 myvars 存在等等
因为这是错误的,并且在 otherfunc()中使用时没有定义全局变量 myvars ,因此该链接未找到该变量,并表示未定义
您可以将 myvars 的定义放在 main 之外,以使其成为全局变量,但可以在 main
中对其进行初始化。struct newType *myvars;
int main(int myvalue){
myvars = ...; // myvalue is an int, to do myvars = myvalue has no sense
return 0;
}
其他说明:可能您对 main 函数接收的参数有误,这与您期望的不一样
答案 1 :(得分:2)
语句extern struct newType *myvars;
声明myvars
是具有外部链接的标识符。
当struct newType *myvars = myvalue;
出现在函数中 时,它声明myvars
是没有链接的标识符。因为它没有链接,所以不会链接到先前的声明。 (myvars
的声明也是一个定义,因为它会导致创建对象。)
程序中没有myvars
的定义具有外部链接,因此第一个声明永远不会链接到定义。
要创建具有外部链接的myvars
的定义,必须将struct newType *myvars = myvalue;
放在函数的外部。
答案 2 :(得分:1)
您需要使指针全局化。
// this is wrong as myvars is only exists in the main function scope
// and when you call any other function from main it stops to be accesible
int main(){
struct newType *myvars = myvalue;
/* .... */
}
// Now it is global and can be used from other functions / compilation units
// you can initilaze this way if the myvalue is a contant expression
struct newType *myvars = myvalue;
int main(){
/* .... */
}
如果myvalue
不是常量表达式,则需要在函数主体中对其进行初始化(例如main
)
struct newType *myvars;
int main(){
myvars = myvalue;
/* .... */
}
main
有一个非常具体的参数,它们分别称为argc
和argv