在C++中编译全局变量的重新声明错误,但不在C中编译

coe*_*udo 9 c c++ compiler-errors compilation global-variables

假设我有这三个文件:

//a.h header
#include <stdio.h>
int int_variable;

void a_f()
{
   printf("int_variable: %d\n", int_variable)
   int_variable++;
}
Run Code Online (Sandbox Code Playgroud)

BH

//b.h header
#include <stdio.h>
int int_variable;

void b_f()
{
   printf("int_variable: %d\n", int_variable)
   int_variable++;
}
Run Code Online (Sandbox Code Playgroud)

main.c中

//main.c
#include "a.h"
#include "b.h"

int main()
{
   a_f();
   b_f();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么在C++中编译会产生重定义错误,但在C中却没有?我是C++开发人员,然后在C++中对我有意义,但为什么在C中这不是错误?

当我执行C生成的代码时,输​​出是:

int变量:0

int变量:1

R S*_*hko 7

在C中,这两个变量实际上组合成一个变量,因为它们都没有显式初始化.

如果您将两个h文件都更改为:

// a.h
int int_variable = 0;
Run Code Online (Sandbox Code Playgroud)

和:

// b.h
int int_variable = 0;
Run Code Online (Sandbox Code Playgroud)

你会得到一个重新定义的错误.