我试图通过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编译器。
感谢您的帮助。
答案 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
的常量表达式。)