英文:
typeid(x).name() yields 'y', what does it mean?
问题
在下面的代码中,我们得到:
12 4
y
typeid().name应该返回数据类型,
但我找不到'y'代表哪种数据类型 🤔
void alignment()
{
struct Foo
{
int i;
float f;
char c;
};
std::cout << sizeof(Foo) << '\t' << alignof(Foo) << '\n';
auto x = alignof(Foo);
std::cout << typeid(x).name() << '\n';
}
我尝试查找与数据类型名称的关联,但没有找到匹配的内容。
英文:
In Code below, we get:
12 4
y
typeid().name should return data type,
but I cannot find which data type 'y' means 🤔
void alignment()
{
struct Foo
{
int i;
float f;
char c;
};
std::cout << sizeof(Foo) << '\t' << alignof(Foo) << '\n';
auto x = alignof(Foo);
std::cout << typeid(x).name() << '\n';
}
I tried to find an association with data type names but nothing fits
答案1
得分: 3
我尝试找到与数据类型名称相关的关联,但没有找到合适的。
您的编译器将std::size_t
命名为y
,而我的编译器将其命名为m
,这两者都是正确的,完全允许的。
根据:
https://en.cppreference.com/w/cpp/types/type_info/name
一些实现(如MSVC、IBM、Oracle)生成人类可读的类型名称。其他一些实现,尤其是gcc和clang,返回被Itanium C++ ABI规定的mangled名称。可以使用特定于实现的API(例如abi::__cxa_demangle)或通过boost::core::demangle来将mangled名称转换为人类可读形式。也可以通过命令行实用程序c++filt -t来传递它。
而alignof
返回size_t
,请参阅这里。
使用Boost进行解缠示例:
https://godbolt.org/z/8959KdMhv
英文:
> I tried to find an association with data type names but nothing fits
Your compiler gave std::size_t
name y
, mine called it m
, both are right and fully allowed to.
According to:
https://en.cppreference.com/w/cpp/types/type_info/name
> Some implementations (such as MSVC, IBM, Oracle) produce a human-readable type name. Others, most notably gcc and clang, return the mangled name, which is specified by the Itanium C++ ABI. The mangled name can be converted to human-readable form using implementation-specific API such as abi::__cxa_demangle directly or through boost::core::demangle. It can also be piped through the command-line utility c++filt -t.
And alignof
returns size_t
, see here.
Example with demangling that using Boost:
https://godbolt.org/z/8959KdMhv
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论