編寫代碼時,有時候需要找到某個結構的定義,例如類型,成員變量名.首先使用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,如需轉載請自行聯系原作者