0

我对C17 标准中的一个主题有点困惑。

在 6.2.2 的第 5 点中,您可以阅读:

如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符 extern 声明的一样。[...]

这意味着它可以具有内部或外部链接,具体取决于该函数之前的其他声明(如果有)。

另一方面,在 6.7.6.3 示例 1(第 16 和 17 点)中,您可以阅读:

int f(void), *fip(), (*pfi)();

[...]

如果声明出现在任何函数之外,则标识符具有文件范围和外部链接。[...]

所以,没关系pfi(它不是一个函数,而是一个指针),但是fand会发生什么fip?这不是矛盾吗?在 6.2.2 中,它“好像存在外部存储类说明符”(这并不总是意味着它将具有外部链接),但在 6.7.6.3 中,外部链接似乎是理所当然的。

我错过了什么?

编辑:更具体地说,如果我们在文件范围内有此代码:

// One random "previous declaration":
static int f(void);  // declares internal linkage
// Now, the important line, from the initial example:
int f(void);  // Internal linkage? External linkage?

6.2.2 声明第二个声明具有内部链接

6.7.6.3 声明第二个声明具有外部链接

4

1 回答 1

2
于 2021-06-20T11:03:04.103 回答