【问题标题】:How do I assign values to or modify an extern struct declared in C header file?如何为 C 头文件中声明的外部结构赋值或修改?
【发布时间】:2020-04-20 21:10:00
【问题描述】:

我在我的头文件 aba.h 中声明了 2 个 termios 结构:

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 中调用。

我尝试了以下几种解决方案: Undefined reference to global variable during linkingC: undefined reference to a variable when using extern 但得到了一堆不同的错误。

我已经附上了我的终端的图片。 WSL-Ubuntu-18.04-Screenshot

【问题讨论】:

    标签: c gcc extern undefined-reference termios


    【解决方案1】:

    声明一个对象不会导致它存在。您需要实际定义它。放

    struct termios rawInput;
    

    在您的.c 文件之一的顶层(不在任何函数内部)可选地使用初始化程序。

    【讨论】:

    • 如何在 main.c 中初始化它们? rawInput = NULL;rawInput = { 0 }; 不起作用。
    • @ntruter42:您是在问如何在编译时或运行时初始化它们?即使没有指定任何初始化程序,它们也会在编译时自动初始化为零。如果由于某种原因您需要在运行时再次将它们归零,您可以使用复合文字:rawInput = (struct termios){0};
    • 编译时间。 gcc -Werror 标志报告警告unused variable 'rawInput',我想保留该标志。我在函数stdin_prep(); 和另一个函数stdin_change("raw"); 中使用变量,这两个函数都在主函数中调用,但-Werror 标志无法识别这一点。我主要定义它们是因为它们必须对所有功能全局可用。知道如何使用它们来消除警告吗?
    • 我不太明白你在做什么。你能发布完整的代码吗?请注意,定义 struct termios rawInput; 与任何其他全局变量的定义一样,应该位于顶层(不在任何函数定义内,甚至不在 main 内)。你不应该得到一个未使用的变量警告
    • 我把定义放在int main(void) {... 上面,这就解决了问题!谢谢。
    【解决方案2】:

    这些

    extern struct termios cookedInput, rawInput;
    

    是 struct termios 类型的两个对象的前向声明,但不是它们的定义。

    你必须在某个模块中定义对象。

    例如,您可以使用 main 在模块中定义。

    struct termios cookedInput, rawInput;
    

    如果您不为对象明确指定初始化器,那么它们将被初始化为

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

    【讨论】:

    • 我试图在 main 中定义它们,但 gcc -Werror 将其报告为未使用的变量,即使我在 main 内部的函数 stdin_prep(); 中使用它。如何显式指定初始化程序,甚至指定某种 NULL 值?
    • @ntruter42 在定义函数的模块中定义它们。:)
    猜你喜欢
    • 2011-02-13
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多