对于您正在使用的构建工具和开关,int my_var;的作用主要类似于一个声明。允许对对象标识符进行多次声明。 int my_var = 0;是一个定义。应该只有一个定义。 由于C的使用和发展历史,int my_var;在技术上是一个暂定的定义。如果翻译单元中没有my_var的常规定义(正在编译的源文件,包括它包含的所有文件),它将充当常规定义。 但是,如果在包含在多个源文件中的头文件中有此项,则会有多个定义。当具有外部链接的同一对象标识符有多个定义时,C标准不定义该行为。 当存在多个常规定义时,生成工具会报告错误。然而,它们对来自暂定定义的定义的处理方式不同:它们允许这些定义,并将它们合并成一个单一的定义。同样,这是由于C语言发展和使用的历史。此外,GCC最近也改变了这种行为。在GCC版本10之前,默认情况下合并了暂定定义,如上所述。对于GCC 10及更高版本,暂定定义不会合并,多个定义将导致错误。可以使用开关-fcommon请求旧行为。 为了避免临时定义,您应该将头中的标识符声明为extern int my_var;,这只是一个声明而不是临时定义,并且您应该有一个包含int my_var = 0;的源文件,这是一个常规定义而不是临时定义。 其他信息在这里、这里和这里。