我有一个header header.hxx像这样:
// header.hxx
#ifndef HEADER1
#define HEADER1
typedef struct s_ringreader{
// some stuff in header
} RingReader;
RingReader defaultReader;
#endif
和多个这样的cxx,source1.cxx
// source1.cxx
# include "header.hxx"
void fun1(){
// some stuff using defaultReader
}
,source2.cxx
// source2.cxx
# include "header.hxx"
void fun2(){
// some other stuff using defaultReader
}
和source3.cxx
// source3.cxx
# include "header.hxx"
void fun3(){
// some other stuff using defaultReader
}
我的问题是,我不应该得到多个定义错误,因为我包括头三次?从理论上讲,为了不得到这个错误,我应该使用static
或extern
作为RingReader defaultReader
,但这并没有发生。
需要注意的是,这种情况发生在某些版本的arm-poky编译器上,而不是其他版本。是否有任何情况下(如不同的编译器),这些情况不被视为错误?
1条答案
按热度按时间fiei3ece1#
由于这段代码是有效的C和C++,某些编译器将作为扩展(C11 §J.5.11)将未初始化的全局变量解释为公共符号。它们的作用类似于C17内联变量,并在链接时合并。这一解释(就像任何其他!)符合C实现,因为程序是病态的,不需要诊断。