启用 -Wabi-tag 时,我在尝试返回 std::string (按值)时收到警告。此警告的目的是什么,即忽略它会导致什么危害?
有哪些选项可以避免此警告?我想我可以将
abi
标签添加到我的函数中,但这看起来有点难看,并且可能会通过 codebase
传播(恐怕)。我认为无论如何,使用 C++11+ 应该意味着适当的 ABI。
示例:
#include <string>
#include <iostream>
static
std::string hello() // <- warns here
{
return "Hello, world";
}
int main()
{
std::cout << hello() << std::endl;
}
警告显示(是的,我也启用了 -Werror):
error: ‘std::string hello()’ inherits the "cxx11" ABI tag that ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} (used in its return type) has [-Werror=abi-tag]
来自gcc的文档:
abi_tag 属性可以应用于函数、变量或类声明。它修改实体的重整名称以合并标签名称,以便将函数或类与具有不同 ABI 的早期版本区分开;也许该类已更改大小,或者该函数具有不同的返回类型,该返回类型未在损坏的名称中进行编码。
-Wabi-tag 标志可以对不具有其子对象和虚函数使用的所有 ABI 标签的类发出警告;对于代码需要与早期 ABI 共存的用户,使用此选项可以帮助找到所有需要标记的受影响类型。
只有当您链接到由不同版本的 gcc 编译的代码时,您才需要关心这一点。如果您的构建过程是从头开始编译所有内容,那对您来说并不重要。