c++ 多个定义错误在应该发生的时候没有发生

xxe27gdn  于 2023-05-24  发布在  其他
关注(0)|答案(1)|浏览(105)

我有一个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
}

我的问题是,我不应该得到多个定义错误,因为我包括头三次?从理论上讲,为了不得到这个错误,我应该使用staticextern作为RingReader defaultReader,但这并没有发生。
需要注意的是,这种情况发生在某些版本的arm-poky编译器上,而不是其他版本。是否有任何情况下(如不同的编译器),这些情况不被视为错误?

fiei3ece

fiei3ece1#

由于这段代码是有效的C和C++,某些编译器将作为扩展(C11 §J.5.11)将未初始化的全局变量解释为公共符号。它们的作用类似于C17内联变量,并在链接时合并。这一解释(就像任何其他!)符合C实现,因为程序是病态的,不需要诊断。

相关问题