无法扩展某些宏(GNU99编译器)

时间:2015-04-29 03:31:32

标签: c gcc

我试图通过gcc使用-E标志来理解C预处理器。

gcc -E -Wall simpleSocket.c

我的源代码是(保持简单):

#include<stdio.h>
#include<sys/socket.h>

int main(){
    int socketID = 0;
    int Socket_Protocol = 6;

    socketID = socket(AF_INET,SOCK_STREAM,Socket_Protocol);
    printf("Socket created is %d",socketID);
    return 0;
}

替换代码显示:

int main(){                                                                                                                                                                                                                                             
    int socketID = 0;                                                                                                                                                                                                                                      
    int Socket_Protocol = 6;                                                                                                                                                                                                                               

    socketID = socket(2,SOCK_STREAM,Socket_Protocol);                                                                                                                                                                                                      
    printf("Socket created is %d",socketID);                                                                                                                                                                                                               
    return 0;                                                                                                                                                                                                                                              
}

尽管在 socket.h 库中定义了SOCK_STREAM,但它不会被替换。我无法弄清楚为什么会这样?我正在使用GNU99编译器。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

SOCK_STREAM未展开,因为它不是宏。

我抓住了你的代码副本并在我的系统上通过gcc -E运行,得到了类似的结果。如果您搜索SOCK_STREAM的输出,则会找到与此类似的定义(我删除了一些可能是评论的空白行):

enum __socket_type
{
  SOCK_STREAM = 1,
  SOCK_DGRAM = 2,
  SOCK_RAW = 3,
  SOCK_RDM = 4,
  SOCK_SEQPACKET = 5,
  SOCK_DCCP = 6,
  SOCK_PACKET = 10,
  SOCK_CLOEXEC = 02000000,
  SOCK_NONBLOCK = 00004000
};

(枚举常量是类型int的常量表达式。)