Как назначить значения или изменить внешнюю структуру, объявленную в заголовочном файле C? - PullRequest
0 голосов
/ 21 апреля 2020

Я объявил 2 члена ios структуры в моем заголовочном файле aba.h:

extern struct termios cookedInput, rawInput;

И затем в функции я попытался изменить значения в stdin_prep.c следующим образом:

tcgetattr(STDIN_FILENO, &cookedInput);
rawInput = cookedInput;
cfmakeraw(&rawInput);

gcc -Wall -Werror -Wextra *.c дает мне следующие ошибки:

In function stdin_change.c
stdin_change.c:(.text+0x26): undefined reference to 'rawInput'
stdin_change.c:(.text+0x55): undefined reference to 'cookedInput'

Эти функции stdin_prep(); и stdin_change("raw"); вызываются в моем main.c.

Я пробовал несколько решений из: Неопределенная ссылка на глобальную переменную при связывании и C: неопределенная ссылка на переменную при использовании extern , но получено множество различных ошибок.

Я включил фотографию моего терминала. WSL-Ubuntu-18,04-Скриншот

Ответы [ 2 ]

3 голосов
/ 21 апреля 2020

Объявление объекта не приводит к его существованию. Вы должны на самом деле определить это. Поместите

struct termios rawInput;

опционально с инициализатором, на верхнем уровне (не внутри какой-либо функции) ровно в один из ваших .c файлов.

0 голосов
/ 21 апреля 2020

Это

extern struct termios cookedInput, rawInput;

- это предварительные объявления двух объектов типа struct term ios, но не их определения.

Вы должны определить объекты в некотором модуле.

Например, вы можете определить в модуле с помощью main.

struct termios cookedInput, rawInput;

Если вы не будете явно указывать инициализаторы для объектов, то они будут инициализированы как

struct termios cookedInput = { 0 }, rawInput = { 0 };
...