有时我需要在用C或C ++编程时学习表达式的类型。有时会有一个好的IDE或现有的文档来帮助我,但有时候没有。我经常觉得这样的构造可能很有用:
void (*myFunc)(int);
printf("%s", nameoftype(myFunc)); //"void (*)(int)"
int i, unsigned int u;
printf("%s", nameoftype(i+u)); //"unsigned int"
对于C ++尤其如此;认为const对象的访问器 - 它们是返回const引用还是副本?想想动态演员表和模板化课程。
我该怎么做? (即学习表达的类型)
我使用GCC但据我所知,它没有这样的扩展名。所以我想我很好奇人们如何解决这个问题。 (欢迎编译时和运行时解决方案。)
答案 0 :(得分:17)
有时我只是这样做:
int ***a = expression;
并查找“<表达式类型>无法分配给指针到^ 3 int”错误。这似乎是最便携的解决方法。
答案 1 :(得分:2)
C ++有一个typeid
运算符;
typeid(expression).name()
将返回表达式类型的实现定义名称。唉,它通常不是人类可读的。
答案 2 :(得分:2)
你在找什么?自动类型推断或查找类型,以便您可以手动正确声明变量? (你自己的答案看起来像你想要第二个)。在这种情况下,请考虑使用Geordi:
<litb> make type pointer to function taking pointer to array of 10 int returning void
<geordi> void (*)(int (*)[10])
<litb> geordi: { int a = -1; unsigned int b = 0; cout << ETYPE(a + b), ETYPE_DESC(a + b), (a + b); }
<geordi> rvalue unsigned int, rvalue unsigned integer, 4294967295
<litb> geordi: << TYPE_DESC(void (*)(int (*)[10]))
<geordi> pointer to a function taking a pointer to an array of 10 integers and returning nothing
如果没有诸如boost.typeof之类的辅助库,目前无法进行自动类型推断,它将为GCC使用__typeof__
之类的编译器扩展。下一个C ++将获得auto
(具有与当前auto
不同的语义)并且能够与decltype
一起执行此操作以获取表达式的类型。
如果您可以离开本地环境,您可以随时创建一个这样的功能模板:
template<typename T> void f(T t) { /* ... */ }
int main() { int a = -1; unsigned int b = 0; f(a + b); }
答案 3 :(得分:1)
尝试Boost.Typeof以确定它是否合适。
答案 4 :(得分:1)
gcc在编译时有typeof()。它的作用类似于sizeof()。