【发布时间】:2016-12-22 10:41:08
【问题描述】:
我有以下带有 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_tail、num_head 和 stack_head),编译器(clang 版本 3.8.0 和 gcc 5.4.0)编译此代码没有错误并且程序可以运行正如它应该。但是,就我而言,由于 structs.h 中缺少 extern 修饰符,这段代码不应该正常编译和工作。为什么它有效? :)
UPD:是的,答案是暂定定义。实际上,在初始化指向NULL 的指针后,编译器会给出错误消息。谢谢大家的回复!
【问题讨论】:
-
查找“暂定定义C”
-
尝试将标题包含到 2 个不同的
.c文件中,看看会发生什么...... -
这里有一个link 到这个程序的存储库。标头包含在所有 .c 文件中,一切正常。
-
@LPs 什么都没有,因为
gcc会将两个文件的变量放入一个公共部分(FORTRAN 样式)。 -
LPs 通常是的,但
gcc有一个扩展名,在所有翻译单元中,未初始化的外部链接变量被组合(好像所有定义前面都有一个extern,除了一个)。