tips for C/C++

2015年08月11日

  1. 类数组delete

    基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 没有区别。但是对于类对象数组,只能用 delete[]。

  2. Ubuntu安装Sqlite3

    安装数据库系统Sqlite3:

     apt-get install sqlite sqlite3
     #注:在程序中使用Sqlite3
    

    编译还需要安装Sqlite3编译需要的工具包:

     apt-get install libsqlite3-dev
    

    包含头文件#include <sqlite3.h>,编译时在连接器选项中加入选项-lsqlite3

  3. switch语句中case跳过变量初始化的问题

    case语句中不允许直接定义变量,因为当此case条件不被执行时变量将无法初始化。解决的办法是case后面的结构用{}括起来以限制变量的作用域。如

     switch (a)
     {
         case 0:
             POINTS p = *(POINTS *)a;
             int i = 0;
             break;
         case 1:
             break;
     }
    

    编译报错:error C2360: initialization of 'i' is skipped by 'case' label

    用这样写才对:

     switch (a)
     {
         case 0:
         {
             POINTS p = *(POINTS *)a;
             int i = 0;
             break;
         }
         case 1:
         break;
     }
    
  4. 在字符串中删除某个字符,STL的妙用

     #include <iostream>
        
     #include <string>
     #include <algorithm>
     #include <functional>
    
     using namespace std;
    
     int main(int argc, const char *argv[])
     {
    
         string str(" d df df ");
         string::iterator new_end = remove_if(str.begin(), str.end(), bind2nd(equal_to<char>(), ' '));
    
         str.erase(new_end, str.end());
         cout << str << endl;
         return 0;
     }
    
  5. 在源代码中查找宏定义

     gcc -E $CompileOptions $SourceFile | \
     egrep "^# " | grep -v '<'| cut -f 2 -d '"' | \
     sort | uniq |
     while read line
         do
                 grep -l $MacroName $line
         done
    
  6. 需要在std命名空间内重载STL容器(如std::vector)的比较操作符,否则不会被诸如std::set等容器自动应用。