b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c++ strchr函数_strtok函数_strchr函数php

电脑杂谈  发布时间:2017-03-04 03:05:58  来源:网络整理

strchr函数php_strtok函数_c++ strchr函数

cmdline是一个轻量级的c++命令行参数解析工具,全部源码只有一个cmdline.h头文件,使用起来非常方便,关于如何使用它,不是本文讨论的重点,本文要说的是如何解决cmdline在MSVC下不能编译的问题。

cmdline项目托管地址Github:https://github.com/tanakh/cmdline

我在使用cmdline的时候,在gcc下编译都正常,但在MSVC环境下,是不能编译的,因为缺少头文件cxxabi.h,这个头文件MSVC是没有的。c++ strchr函数开始发现这个问题后,打算绕过它,只在gcc下编译,但因为其他原因逼得我只能想办法在MSVC下编译,所以就要解决这个问题。

怎么办呢?我尝试着注释掉cmdline.h中#include <cxxabi.h>这一行代码,发现只有一个地方报错,就是下面的函数,也就是说#include <cxxabi.h>中的函数只在这一处被用到,貌似问题不那么大,所以我就继续深入研究下去。

static inline std::string demangle(const std::string &name)
{
  int status=0;
  char *p=abi::__cxa_demangle(name.c_str(), 0, 0, &status);//用到cxxabi.h中的函数
  std::string ret(p);
  free(p);
  return ret;
}
template <class T>
std::string readable_typename() // 获取类型T名称
{
  return demangle(typeid(T).name());// 调用demangle返回类型T的真实名字
}

C/C++语言在编译以后,函数和数据类型的名字会被编译器修改,改成编译器内部的名字,这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时,显示的就是被编译器修改过的名字,比如说_Z3foov ,

数据类型名称也是一样,比如在gcc下double的类型内部名字就变成了’d’,

strchr函数php_c++ strchr函数_strtok函数

gcc下调用typeid(double).name()返回的结果是’d’ 。

那么这个函数或类型真实的名字是什么呢?

如何在运行时获取类型或函数真实的名称呢?

上面这个demangle函数中调用的abi::__cxa_demangle的作用就是将编译器内部使用的名字反向转换(demangle)为源代码中定义的名字。

MSVC为什么没有提供abi::__cxa_demangle类似的功能呢?因为MSVC编译器编译的代码typeid返回的是demangle后的结果。

也就是说,在MSVC下typeid(double).name()返回的就是”double”。c++ strchr函数所以不需要类似的功能。

找到原因就好办了,只需要用宏定义改造代码就好了,只需要修改两处代码

strtok函数_strchr函数php_c++ strchr函数

1.修改#include部分

//当编译器非gcc时,不包含cxxabi.h头文件
#ifdef __GNUC__
#include <cxxabi.h>
#endif

2.修改demangle函数,当编译器为MSVC时直接将输入参数返回

static inline std::string demangle(const std::string &name)
{
#ifdef _MSC_VER
  return name; // 为MSVC编译器时直接返回name
#elif defined(__GNUC__) 
  // 为gcc编译器时还调用原来的代码
  int status=0;
  char *p=abi::__cxa_demangle(name.c_str(), 0, 0, &status);
  std::string ret(p);
  free(p);
  return ret;
#else
// 其他不支持的编译器需要自己实现这个方法
#error unexpected c complier (msc/gcc), Need to implement this method for demangle
#endif
}

《如何识别C++编译以后的函数名(demangle)》

《C++类名demangle》

《abi::__cxa_demangle》

下面是修改后的cmdline完整代码:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-35663-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...