__typeof __()和__typeof()是C语言的特定于编译器的扩展,因为标准C不包含这样的运算符。 标准C要求编译器使用双下划线为语言扩展添加前缀(这也是您不应该为自己的函数,变量等执行此操作的原因)
typeof()完全相同,但是将下划线抛出窗口,理解每个现代编译器都支持它。 (实际上,现在我想到它,Visual C ++可能不会。它确实支持decltype(),它通常提供与typeof()相同的行为。)
所有三个都意味着相同的东西,但没有一个是标准的C,所以符合标准的编译器可以选择使任何意思有所不同。
#include <iostream>
using namespace std;
#define min(x,y) ({\
typeof(x) _x=x;\
typeof(y) _y=y;\
(void) (&_x==&_y);\
_x<_y?_x:_y;})
int main()
{
int *pvar=NULL;
typeof(*pvar) var=999;
typeof(pvar) vvar=&var;
cout<<var<<endl;
cout<<vvar<<endl;
cout<<min('a','b')<<endl;
cout<<min(2,44)<<endl;
}
999
0x7ffe8a4951cc
a
2
#include <iostream>
using namespace std;
int main()
{
int i=0;
decltype(i) d=2;
decltype((i)) dd=d;
cout<<d<<endl;
cout<<dd<<endl;
}
root@iZwz9d2igx9zyp8enw8g5pZ:/home/leecode# g++ test1.cpp -o test1 -std=c++11
root@iZwz9d2igx9zyp8enw8g5pZ:/home/leecode# ./test1
2
2
decltype((variable))(注意是双层括号)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用
参考:
https://stackoverflow.com/questions/14877415/difference-between-typeof-typeof-and-typeof-objective-c
https://blog.csdn.net/zhanshen2015/article/details/51495273/