gcc中获知表达式的类型

有时候我们想知道一个东西它具体是什么类型。比如,pthread_t,它到底是个整数呢,还是个指针呢,还是什么其它东西呢?幸运的是,gcc的abi中有一个函数可以帮我们的忙。

#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
#include <stdlib.h>
#include <pthread.h>

using namespace std;

int main(int argc, char* argv[]) {
  int status;
  pthread_t thr;
  char* realname = abi::__cxa_demangle(typeid(thr).name(), 0, 0, &status);
  std::cout << realname << std::endl;
  free(realname);
  return 0;
}

# g++ -o t test.cpp -g3 -Wall

# ./t

unsigned long

另外,我们还可以用它来检查下数字和字符串常量是什么类型。比如0xFFFFFFFF是什么类型?

#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
#include <stdlib.h>
#include <pthread.h>

using namespace std;

int main(int argc, char* argv[]) {
  int status;
  char* realname = abi::__cxa_demangle(typeid(0xFFFFFFFF).name(), 0, 0, &status);
  std::cout << realname << std::endl;
  free(realname);
  return 0;
}

还是很有趣的.比如0x0FFFFFFF的类型是int,而0xFFFFFFFF的类型就是unsigned int。

Integer literals基本规则:

以0开头的一定是8进制
以0x开头的一定是16进制
10进制数字一定不能以0开头

后缀:u,ul,ull

从这个列表按照以下规则筛选int、unsigned int、long 、unsigned long 、long long 、unsigned long long

不带u的10进制数一定是有符号的。8进制和16进制可以是无符号的。
带u的一定是无符号
带l的一定不是int或unsigned int。
ll代表long long。于是就只能在long long 、unsigned long long中选。
筛完的结果,从左往右,选第一个。

比如拿0x0FFFFFFF来说,它是16进制数字,所以可以是有符号的,也可以是无符号的。在这个列表中,int、unsigned int、long 、unsigned long 、long long 、unsigned long long。第一个是int,试了一下,OK!

比如拿0xFFFFFFFF来说,它是16进制数字,所以可以是有符号的,也可以是无符号的。在这个列表中,int、unsigned int、long 、unsigned long 、long long 、unsigned long long。第一个是int,试了一下,装不下,所以就只好换下一个。unsigned int。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥