C++ skills record

Note from daily use.

C++11

decltype

字面意思类型获取,可通过表达式分析出结果类型。

参考:https://www.cnblogs.com/cauchy007/p/4966485.html

引申:追踪返回类型

1
2
3
4
template <typename T1, typename T2>
auto sum(T1& t1, T2& t2) -> decltype(t1 + t2) {
return t1 + t2;
}

编译通过,执行时根据decltype(t1 + t2)判断类型,结合auto实现自动判断函数返回类型。


  • ANSI C标准中有几个标准预定义宏(也是常用的):

    __LINE__:在源代码中插入当前源代码行号;

    __FILE__:在源文件中插入当前源文件名;

    __DATE__:在源文件中插入当前的编译日期

    __TIME__:在源文件中插入当前编译时间;

    __STDC__`:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

    __cplusplus:当编写C++程序时该标识符被定义。

    以上宏在编译时被替换,像DATE、TIME是被固定的,企图用在日志名字是不现实的

  • ##允许可变参数为空,如#define CLOG(format, ...) consoleString(format, ##__VA_ARGS__);,不加##时若CLOG(“haha”)会出错。

char & string

_TRUNCATE

_TRUNCATE 指定字符串截断行为;尽可能保留字符串并不产生错误。

1
2
3
char src[] = "1234567890";
char dst[dst_len];
errno_t err = _snprintf_s(dst, _countof(dst), _TRUNCATE, src);
  • dst_len > strlen(src) , err = strlen(src);
  • dst_len <= strlen(src)
    • 不使用_TRUNCATE,程序奔溃出错;
    • 使用_TRUNCATE,err = -1,dst保留最大字符串。

使用 err = strncpy_s(dst, _countof(dst), src, _TRUNCATE); 情况相同;

  • dst_len > strlen(src) , err = 0;
  • dst_len <= strlen(src)
    • 不使用_TRUNCATE,使用_countof(src),程序奔溃出错;
    • 使用_TRUNCATE,err = STRUNCATE,dst保留最大字符串。