声明与定义:GCC 错了吗?

Declaration vs definition: is GCC wrong?

根据 ISO9899:2017 § 6.7-5:

A declaration specifies the interpretation and attributes of a set of identifiers. A definition of an identifier is a declaration for that identifier that: — for an object, causes storage to be reserved for that object;

我想这与所有版本的 C 标准完全相同。

当我尝试使用 GCC 编译以下代码时:

int main(void)
{   extern int myVariable; // Declaration of myVariable.
    int myVariable; // Definition of myVariable.
    int myVariable; // Definition of myVariable.
}

我收到以下错误:

error: redeclaration of 'myVariable' with no linkage

如果我没记错的话,错误不是重定义?

首先你有这个:

extern int myVariable; 

extern 关键字使它成为具有 外部链接 的变量的 声明 。任何此类声明将始终引用同一对象。

那么你有:

int myVariable; 

此标识符具有 块作用域(即在函数内部定义),因此无链接。因为没有链接,所以这样的声明也是定义。

这也是一个错误(虽然你没有显示),因为你在同一范围内对同一标识符有冲突的声明,一个有外部链接,一个没有链接。

然后在相同的范围内你有:

int myVariable; 

这是一个错误,因为您有两个具有相同名称但在同一范围内没有链接的对象,因此有多个定义。

C standard 的第 6.2.2p2 节更详细地描述了链接:

In the set of translation units and libraries that constitutes an entire program, each declaration of a particular identifier with external linkage denotes the same object or function. Within one translation unit, each declaration of an identifier with internal linkage denotes the same object or function. Each declaration of an identifier with no linkage denotes a unique entity.