1. 程式人生 > 實用技巧 >雜項

雜項

C++雜項

Visual studio

參考

  • system("pause"); 防止輸出框一閃而過
  • F5 執行;F11 逐語句debug; F10逐過程
  • F9 新建斷點

void*指標

  • 任何型別指標都可以轉為void*,它無條件接受各種型別
  • 一般用在通用型介面的引數型別
  • 在具體使用時,需要轉化為具體的指標型別

extern "C" : 告訴C++編譯器這段程式碼使用C標準編譯,使得在C和C++混編的情況下兩者得以相容

struct和type struct型別:參考

fprintf :傳送格式化輸出到檔案流 參考

cd - 回到上一目錄

UML類關係圖

參考

C++ try-catch捕獲異常 參考

makefile 教程

  • src原始碼 inc標頭檔案 bin執行碼與so檔案 lib靜態/動態庫
  • etc配置指令碼 tools/op控制與監控指令碼 log日誌目錄

linux下.a 和.o檔案:

  • .a檔案:靜態庫,對函式庫的連結是在編譯期間完成的,程式執行時便和函式庫無關,因為已經拷貝了
  • .o檔案:動態庫,庫函式的連結載入推遲到程式的執行時期;可以節省資源,無需每次都載入所有的函式;而且可以實現在程序之間的資源共享

ln命令:為某一個檔案在另一個文職建立一個同步的連結,類似於win下的快捷方式 參考

  • 軟連線
  • 硬連結

C++中的虛擬函式和純虛擬函式

參考

linux signal函式 參考

http協議:建立在tcp/ip之上的協議,通過TCP連線傳輸資料 參考

C++ epoll:參考 參考2

Socket 參考

  • timeval 結構體 參考 協議實現過程中經常會有同步時間計算獲得時間延遲,一般配合gettimeofday使用
struct timeval
  {
    __time_t tv_sec;		/* Seconds.  */
    __suseconds_t tv_usec;	/* Microseconds.  */
  };

#include <iostream>
#include "sys/time.h"

int main()
{
    struct timeval tv_b, tv_d;
    unsigned long long timeconsumed = 0;
    gettimeofday(&tv_b, NULL);
    for(int i=0;i<100000;i++){}
    gettimeofday(&tv_d, NULL);
    timeconsumed = tv_d.tv_sec - tv_b.tv_sec + (tv_d.tv_usec - tv_b.tv_usec)/1000000;
    
    std::cout << tv_d.tv_usec - tv_b.tv_usec << std::endl;
    return 0;
}
  • string assign方法:將原字串清空,然後賦予新值進行替換

  • struct in_addr:表示一個32位的ipv4地址 參考

    • 網路位元組序:32位的unsigned int,每8位表示IP地址中一個數值;採用大端序(資料的高位在低地址)
struct in_addr {
    in_addr_t s_addr;
};
  • string c_str():參考 將一個string轉換成const* char(C語言風格的字串)
#include <iostream>
#include <string.h>

int main()
{
    std::string s = "1234";
    char *p;
    // p = s.c_str()   //錯誤
    p = new char[s.size() + 1];
    strcpy(p, s.c_str());

    std::cout << p << std::endl;
    delete[] p;
    return 0;
}
輸出
1234
  • inet_ntoa和inet_aton: 參考 將網路位元組序的IP地址和字串表示的點分十進位制IP地址相互轉換
#include <iostream>
#include <stdlib.h>
#include <arpa/inet.h>

int main()
{
    char IP[] = "127.0.0.1";
    in_addr address;
    int number = inet_aton(IP, &address);
    std::cout << number << std::endl;
    std::cout << address.s_addr << std::endl;
    std::cout << inet_ntoa(address) << std::endl;

    return 0;
}
輸出
1
16777343
127.0.0.1

time(0) 返回系統時間(從1970.1.1開始算起,since epoch),單位:秒 參考

  • inet_addr:將點分十進位制的字串轉換為網路位元組序
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>

using namespace std;

int main(){
    int val;
    char str[] = {"127.1.0.1"};
    val = inet_addr(str);
    printf("val: %d\n", val);
    
    return 0;
}
  • netstat -an | grep tcp 檢視當前網路的TCP連線

  • netstat -lnp 檢視網路連線(推薦)

  • tcpdump tcp -i any port 32323 -A -s 512 -nn 抓包分析

  • strcmp : 字串比較

  • strstr:查詢字串第一次出現的位置;strcasestr:查詢字串第一次出現的位置,無視大小寫

  • memset:字串複製函式

  • strtol:將字串根據給定的進位制轉換成long int型

  • memmove(str1, str2, n):從str2中複製n個字元到str1

  • sprintf(str1, st2):傳送格式化輸出str2到str1

  • fread() :讀取檔案流

  • rm core* 刪除所有帶core的檔案

  • core檔案參考 程式執行期間發生了segment fault段錯誤,作業系統會把此程式當前的記憶體資訊dump到磁碟上,即生成core檔案,可以使用gdb對core檔案進行分析出程式crash的地方。core檔案表明程式出現了嚴重的錯誤,需要詳細的debug

  • Fiddler,參考 一個http的除錯代理,以代理伺服器的方式監聽系統的http網路資料流動。

  • g++編譯引數 參考 參考2

  • .a和.so 靜態庫與動態庫:參考

  • makefile 中隱式規則 參考 CXX=g++

  • assert : 斷言,用於除錯程式和檢查錯誤;一般用於檢驗引數的合法性,但是頻繁的呼叫assert會極大影響程式的效能,增加額外的開銷

  • strtok:與要搜尋的字串的順序無關

    #include <stdlib.h>
    using namespace std;
    
    int main(){
        char method[100];
        char filename[100];
        char buffer[] = "GET /index.html HTTP/1.1\r\n";
    
        strcpy(method, strtok(buffer, " /"));
        strcpy(filename, strtok(NULL, "/ "));
        //strcpy(filename, strtok(NULL, " /"));
        printf("%s, %s\n", method, filename);
        
        return 0;
    }
    
  • 主機位元組序與網路位元組序:參考

    htonl, htons, ntohl, ntohs h表示主機,n表示網路,l表示整形long,s表示短整型short

    #include <stdlib.h>
    #include <arpa/inet.h>
    
    using namespace std;
    
    int main(){
        unsigned long a = 0x12345678;
        unsigned char *p = (unsigned char*)(&a);
        printf("主機位元組序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]);
        printf("主機位元組序數字大小: %d\n", a);
    
        unsigned long b = htonl(a);
        printf("網路位元組序數字大小: %d\n", b);
        p = (unsigned char*)(&b);
        printf("網路位元組序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]);
        
        return 0;
    }
    
  • IP地址與網路位元組序 參考

    #include <netinet/in.h>
    
    using namespace std;
    
    int main(){
        struct in_addr ipaddr;
        unsigned int addr = inet_addr("127.0.0.1");
        printf("addr = %d\n", ntohl(addr));
    
        ipaddr.s_addr = addr;     //addr為網路位元組序
        printf("%s\n", inet_ntoa(ipaddr));
        return 0;
    }
    
  • 棧記憶體和堆記憶體參考 new出來的物件儲存在堆記憶體中,直接定義的陣列儲存在棧記憶體中;棧記憶體很小,32M,但是速度快;當需要大的buffer時,要new出來,而不是直接char *;不然會報segment fault段錯誤

  • fread的r和rb模式:對於普通文字使用r,圖片使用rb;使用r會遺漏某些控制的字元

  • .gitignore忽略檔案:參考

  • coderunner使用C++11標準 參考