天天看點

vim編輯C++代碼尋找标準庫中結構的的定義

 編寫代碼時,有時候需要找到某個結構的定義,例如類型,成員變量名.首先使用gcc -E file.cpp -o file.ii進行預編譯,然後使用more指令打開file.ii,可以看到所有預編譯的頭檔案所在的全路徑.

打開相應的頭檔案,找到相應的結構成員.不過标準庫中的有些結構使用宏,不是那麼直覺,這很讨厭,下面以bind函數使用的socketaddr這個結構為例.下面是代碼(部分):

#include <stdlib.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <unistd.h>

int main()

{

        printf("this is test server\r\n");

        int serversockd = socket(AF_UNIX,SOCK_STREAM,0);

        struct sockaddr serveraddr;

        serveraddr.sa_family = AF_UNIX;

        strcpy(serveraddr.sa_data,"10.1.1.26");

        int ret = bind(serversockd, &serveraddr, sizeof(serveraddr));

        if (0 != ret )

                printf("Error \r\n");

        ...

}

使用gcc -E file.cpp -o file.ii指令,然後打開file.ii,應該能夠看到很多頭檔案的全路徑路徑,下面是幾個例子:

...

# 1 "/usr/include/stdlib.h" 1 3 4

# 25 "/usr/include/stdlib.h" 3 4

# 1 "/usr/include/features.h" 1 3 4

# 323 "/usr/include/features.h" 3 4

# 1 "/usr/include/bits/predefs.h" 1 3 4

# 324 "/usr/include/features.h" 2 3 4

# 356 "/usr/include/features.h" 3 4

可以看到這段代碼引用的頭檔案都在/usr/include及其子目錄中,如果不做說明,隻說打開檔案就指在/usr/include/或其子目錄中打開.

先看一下socketaddr的定義,<sys/socket.h>中有這麼一句,#include <bits/socket.h>,打開bits/socket.h,這個檔案中有這麼一段:

/* Structure describing a generic socket address.  */

struct sockaddr

  {

    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */

    char sa_data[14];           /* Address data.  */

  };

__SOCKADDR_COMMON是一個宏,這個宏的定義在<bits/sockaddr.h>中,打開該檔案,可以看到這麼一句:

#define __SOCKADDR_COMMON(sa_prefix) \

  sa_family_t sa_prefix##family

宏替換__SOCKADDR_COMMON (sa_);後的結果就是:sa_family_t sa_family,也就是說struct sockaddr的定義其實是這樣的:

    sa_family_t sa_family    /* Common data: address family and length.  */

還可以在<sys/un.h>看到sockaddr_un的定義,下面是它的結構:

struct sockaddr_un

    __SOCKADDR_COMMON (sun_);

    char sun_path[108];         /* Path name.  */

它也使用了__SOCKADDR_COMMON.

可以在<netinet/in.h>看到sockaddr_in的定義,下面是它的結構:

struct sockaddr_in

    __SOCKADDR_COMMON (sin_);

    in_port_t sin_port;                 /* Port number.  */

    struct in_addr sin_addr;            /* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */

    unsigned char sin_zero[sizeof (struct sockaddr) -

                           __SOCKADDR_COMMON_SIZE -

                           sizeof (in_port_t) -

                           sizeof (struct in_addr)];

本文轉自jetyi51CTO部落格,原文連結: http://blog.51cto.com/jetyi/823316,如需轉載請自行聯系原作者

繼續閱讀