如何将结构指针对象/变量声明为外部变量?

时间:2019-01-05 12:43:08

标签: c struct extern

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,这个外部结构对我来说是新的。

3 个答案:

答案 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有一个非常具体的参数,它们分别称为argcargv