将结构指针 object/variable 声明为外部
Declare a struct pointer object/variable as an extern
我打算将对象声明为外部对象,但最终有几个 undefined reference to struct object
这是代码
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文件可用。
将结构指针声明为 extern 的正确方法是什么?
int main(int myvalue){
struct newType *myvars = myvalue;
return 0;
}
myvars是局部变量,不是全局变量
但是
extern struct newType *myvars;
说全局变量 myvars 存在等
因为这是错误的,并且在 otherfunc() 中使用时没有定义全局变量 myvars,link 没有找到它并说它是未定义的
您可以将 myvars 的定义放在 main 之外作为全局变量,但可以在 内部初始化它]主要
struct newType *myvars;
int main(int myvalue){
myvars = ...; // myvalue is an int, to do myvars = myvalue has no sense
return 0;
}
补充说明:可能您对 main 函数接收的参数有误,这与您期望的不同
语句 extern struct newType *myvars;
声明 myvars
为具有外部链接的标识符。
当 struct newType *myvars = myvalue;
出现在 内部 一个函数中时,它声明 myvars
是一个没有链接的标识符。因为它没有链接,所以它不会链接到较早的声明。 (这个 myvars
的声明也是一个定义,因为它导致创建一个对象。)
在您的程序中没有任何地方有 myvars
的定义具有外部链接,因此第一个声明永远不会链接到定义。
要使用外部链接创建 myvars
的定义,您必须将 struct newType *myvars = myvalue;
放在函数的 之外。
您需要将指针设为全局。
// 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
我打算将对象声明为外部对象,但最终有几个 undefined reference to struct object
这是代码
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文件可用。
将结构指针声明为 extern 的正确方法是什么?
int main(int myvalue){
struct newType *myvars = myvalue;
return 0;
}
myvars是局部变量,不是全局变量
但是
extern struct newType *myvars;
说全局变量 myvars 存在等
因为这是错误的,并且在 otherfunc() 中使用时没有定义全局变量 myvars,link 没有找到它并说它是未定义的
您可以将 myvars 的定义放在 main 之外作为全局变量,但可以在 内部初始化它]主要
struct newType *myvars;
int main(int myvalue){
myvars = ...; // myvalue is an int, to do myvars = myvalue has no sense
return 0;
}
补充说明:可能您对 main 函数接收的参数有误,这与您期望的不同
语句 extern struct newType *myvars;
声明 myvars
为具有外部链接的标识符。
当 struct newType *myvars = myvalue;
出现在 内部 一个函数中时,它声明 myvars
是一个没有链接的标识符。因为它没有链接,所以它不会链接到较早的声明。 (这个 myvars
的声明也是一个定义,因为它导致创建一个对象。)
在您的程序中没有任何地方有 myvars
的定义具有外部链接,因此第一个声明永远不会链接到定义。
要使用外部链接创建 myvars
的定义,您必须将 struct newType *myvars = myvalue;
放在函数的 之外。
您需要将指针设为全局。
// 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