Как объявить объект / переменную указателя структуры как extern? - PullRequest
0 голосов
/ 05 января 2019

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. Пожалуйста, терпите меня, пока я все еще учусь, и эти внешние структуры являются новыми для меня.

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Оператор extern struct newType *myvars; объявляет myvars идентификатором с внешней связью.

Когда struct newType *myvars = myvalue; появляется внутри функции, оно объявляет myvars идентификатором без связи. Поскольку он не имеет связи, он не будет связан с более ранним объявлением. (Это объявление myvars также является определением, потому что оно вызывает создание объекта.)

Нигде в вашей программе нет определения myvars, которое имеет внешнюю связь, поэтому первое объявление никогда не связано с определением.

Чтобы создать определение myvars с внешней связью, вы должны поместить struct newType *myvars = myvalue; вне функции.

0 голосов
/ 05 января 2019

Вам нужно сделать указатель глобальным.

// 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

0 голосов
/ 05 января 2019
int main(int myvalue){
  struct newType *myvars = myvalue;
  return 0;
}

myvars является локальной переменной, а не глобальной

но

extern struct newType *myvars;

говорит, что gloval var myvars существует и т. Д.

Поскольку это ложно, и не существует определенного глобального var myvars , пока он используется в otherfunc () , ссылка не находит его и говорит, что он не определен


Вы можете поместить определение 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 , и это не так, как вы ожидаете

...