gpt4 book ai didi

c++ - 为什么我的模板需要 C++ 链接?

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:06 26 4
gpt4 key购买 nike

有时我会尝试遵循某些规则的逻辑,有时我所知道的任何规律都与事情发生的逻辑相悖。

通常是一个模板,它被描述为仅存在于编译阶段的东西,它完全等同于为任何给定类型 T 手写一些函数 foo

那么为什么这段代码不能编译(我现在使用 C++11 和 gccclang 但我不认为它是相关的在这种情况下)?

#include <iostream>
#include <cstdint>
#include <cstdlib>
extern "C" {
template <typename T>
T foo(T t)
{
return t;
}
}
int main()
{
uint32_t a = 42;
std::cout << foo(a) << '\n';
return EXIT_SUCCESS;
}

并且打败所有逻辑的是关于链接的提示,隐含的信息是这段代码不生成函数,它生成编译后不适合 C 风格链接的其他东西.

此代码无法编译的技术原因是什么?

最佳答案

让我们从一个简单的角度来看这个问题。至少,使用 extern "C" 将删除 C++ 名称重整。因此,我们将获得您的模板,并将对其进行两次实例化。

int foo(int val);
float foo(float val);

根据 C 的命名规则,从链接器的角度来看,它们必须具有相同的名称 foo。但是,如果它们具有相同的名称,我们将无法区分它们,并且会出现错误。

在 C++ 下,名称如何重组的规则是实现定义的。因此 C++ 编译器将对这两个函数应用名称修饰以区分它们。也许我们会称它们为 foo_intfoo_float

因为 C++ 可以做到这一点,所以我们没有问题。但是 extern "C" 要求编译器应用 C 命名规则。

关于c++ - 为什么我的模板需要 C++ 链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24896411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com