将结构指针 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 有一个非常具体的参数,它们被称为 argcargv