这个外部链接指令是什么意思?
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
函数的风险由您自己决定。
谁能给我解释一下 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
函数的风险由您自己决定。