这个外部链接指令是什么意思?

What does this External Linkage directive mean?

谁能给我解释一下 C++ primer 第 5 版 中的注释:

Note

The functions that C++ inherits from the C library are permitted to be defined as C functions but are not required to be C functions—it’s up to each C++ implementation to decide whether to implement the C library functions in C or C++.

printf 这样的函数是在 C 标准库中定义的,但也需要在 C++ 中使用。但是,C 和 C++ 的不同之处在于它们 link 模块组合在一起的方式:在 C 中,函数仅按名称匹配,但在 C++ 中通常使用完整签名¹ ²。但是为了允许互操作性,可以(使用 extern "C")强制 C++ 函数使用 C linkage,以便它匹配同名的 C 函数(定义可以在任一侧)。

引用的语句似乎表明 C++ 从 C 标准库继承的函数 可能 是实际的 C 函数,但这不是必需的。它们也被允许定义为 C++ 中的常规 C++ 函数(与 C 函数等效,但不完全相同)。

¹ 这是支持重载所必需的; things return 值类型不能使用,因为它不参与重载决策。

² 可能还有其他一些差异。

我会给你一个函数的例子,它可以像 C 或 C++ 一样被“处理”。 std::toupper()也可以写成toupper()。我相信第一个使用 C++ 的一些安全检查,而另一个是严格 C。但它归结为:

#include <cctype>
#include <iostream>

int main (void) {
    char c = 'b';

    std::cout << toupper(c);                                                                     

    return 0;
}

使用 C 方式编译,同时:

#include <cctype>
#include <iostream>

int main (void) {
    char c = 'b';

    std::cout << std::toupper(c);                                                                     

    return 0;
}

使用 C++ 编译寻址命名空间,这就是 @numzero 的回答所说的。

现在两者都可以编译,但是使用 C 函数的风险由您自己决定。