gpt4 book ai didi

c - 一些带有 'extern' 指针的神秘主义者,指向 C 中的结构

转载 作者:太空狗 更新时间:2023-10-29 15:28:31 24 4
gpt4 key购买 nike

我有以下代码片段,其中包含 3 个指向结构的全局指针:

structs.h:

#pragma once

typedef struct Bignum {
int digit;
struct Bignum *next;
struct Bignum *prev;
} Bignum;

typedef struct Stack {
struct Bignum *head;
struct Bignum *tail;
char sign;
struct Stack *next;
} Stack;

Bignum *num_tail;
Bignum *num_head;
Stack *stack_head;

globals.c:

#include "structs.h"

Bignum *num_tail;
Bignum *num_head;
Stack *stack_head;

当我用其他 .c 文件编译它们时(我在其中包含 structs.h 并使用 num_tailnum_headstack_head),编译器(clang 版本 3.8.0gcc 5.4.0)编译这段代码没有错误,程序运行正如它应该。但是,就我而言,由于 structs.h 中缺少 extern 修饰符,此代码不应正常编译和工作.为什么它有效? :)

UPD:是的,答案是暂定定义。实际上,在将指针初始化为 NULL 之后,编译器会给出一条错误消息。感谢大家的回复!

最佳答案

暂定定义。您没有为这些全局变量分配值,因此它们被视为暂定定义。右侧 ={0}; 是假设的,但只是暂时的。如果没有真正的定义,临时定义将被合并。如果有的话,它会在不产生链接器冲突的情况下赢得暂定的。这通常是通过通用符号(在 nm 输出中标记为 C)实现的,这意味着即使在多个翻译单元中,您也可以对同一符号进行暂定定义。 (我认为最好不要依赖此功能并坚持使用 extern 声明和非暂定定义。)

关于c - 一些带有 'extern' 指针的神秘主义者,指向 C 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41281222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com