那些年蹚过的坑(c++)

时间:2022-01-22 21:29:35

1 main中的参数 尽量用英文双引号括起来,否则可能会出现字符串截断的情况(linux gcc 4.4 不加英文引号的话,遇到英文;会丢弃;后面的部分)

2 包含ipv6地址结构体(in6_addr)的头文件

In6addr.h; (Windows Vista and later)

Ws2tcpip.h (Windows Server 2003 and Windows XP)

3 偶然发现的一个特殊用法

在for循环里面有switch结构的时候,break; 是结束switch选择分支,而continue; 则是作用于for循环

for (int i = -1;i<10;++i)

{

switch (i)

{

case 1:

break;

default:

continue;

}

cout<<"i= "<<i<<endl;

}

4 在使用他人提供的动态链接库的时候, 对应的头文件一定要跟动态链接库的头文件完全一致, 否则哪怕只把一个函数变为虚函数, 也会导致在运行时产生莫名其妙的错误

5 mysql 某个用户的Host列为%时, 表示允许任意ip以该用户访问数据库, 但是不包括127.0.0.1. 如果非要这个用户既可以从127.0.0.1,也可以从其他ip访问, 那么应该添加两行记录, 一行写%, 另一行写127.0.0.1

6 inline声明不能用于静态库里面的函数,否则会在编译时找不到函数定义的错误

7 share_ptr 只有执行以下语句后才能指向NULL

  boost::shared_ptr<myobject> client;

  client.reset();

8 小bit有符号整数强制转成大bit无符号

<1>正确步骤: 先转成相同bit的无符号数, 再转成大bit无符号数

  eg: std::int8_t aaa = 239;

    std::uint16_t bbb = (std::uint16_t)(std::uint8_t)aaa; //此时bbb =239

<2>错误步骤: 直接一步强转

  eg: std::int8_t aaa = 239(11101111);

    std::uint16_t bbb = (std::uint16_t)aaa; //此时bbb =65519(11111111 11101111)

9 关于localtime函数

看网上的说法是返回值是一个类型为std::time的静态变量的指针

<1>linux.windows下, 多线程采用以下使用方式 

  tm *p = localtime(&timep);

  时分秒变量的值某些时候也不正确, (┬_┬), 这个是之前输出小时之前没有加"std::setfill('0') << std::setw(2)" 导致时间早于10点时是一位,之后是两位,而审查的时候没有看仔细以为输出错了.  那现在在多线程环境下使用这个函数唯一的缺陷就是时间可能不是很准确

<2>解决办法:

  windows下使用localtime_s, linux下使用localtime_r函数, 这两个函数有两个参数, 可以多线程调用而不出问题, 区别只是参数的顺序不一样

10 一些windows与linux功能相同, 函数名不同的函数

参考自: http://blog.csdn.net/tujiaw/article/details/7871547

  windows:    linux:
  localtime_s   localtime_r
  inet_addr    inet_pton
  GetTickCount    GetTickCount
  Sleep毫秒          sleep秒
  _mkdir             mkdir
  memset            bzero
  _fullpath           realpath

11 vs2013专属坑

在vs2013 update5 中 禁止 _CRT_SECURE_NO_WARNINGS 警告方法, 目前只发现一种, 禁掉的方法很奇葩, 但是很有效.

下面简要说说禁用的方法, 工程中必须使用预编译同文件"stdafx.h", 并且在该文件的#pragma once行之前进行定义宏#define _CRT_SECURE_NO_WARNINGS才有效, 网上针对其他vs版本的方法对这段话开头的版本均无效!!!

12 一个类库缺失引发的血案

linux下, 调用第三方so的时候, 莫名提示加载异常

这个有可能是第三方so的依赖库缺失, 因为这种依赖库缺失, 有的时候会提示, 有的时候不会提示, 确认是否是这个问题的一个简单方法就是 "ldd 第三方so", 如果有提示 "not found" 那就是依赖库缺失, 然后装上对应的依赖库就行了

13 输出linux 下gcc的宏定义

  gcc -posix -E -dM - </dev/null  -->输出 c语言的宏定义

  g++ -posix -E -dM - </dev/null -->输出c++语言的宏定义