用宏定义的形式书写代码块
来源:互联网 发布:抽风解说 知乎 编辑:程序博客网 时间:2024/06/10 13:58
今天读一个ip传输文件的小例子,看到一个宏定义是这样的:
#define TimeBlock(_out, _block) \ struct timeval start; \ struct timeval end; \ struct timeval delta; \ gettimeofday(&start, NULL); \ _block \ gettimeofday(&end, NULL); \ timersub(&end, &start, &delta); \ fprintf(_out, "%lu\n", (delta.tv_sec * 1000000L) + delta.tv_usec);当时感觉好奇怪啊,从没见过这样的书写形式,在论坛问了一下,原来这是一个宏定义的函数,这个函数有两个参数,一个是_out,一个是_block,其中_out是输出,_block是代码块,该函数首先创建3个timeval结构体,然后读取当前时间作为代码块开始时间,执行代码块,读取当前时间作为结束时间,计算代码块执行时间并输出。
具体的宏定义应用如下所示:
TimeBlock(stdout, { if ((socketfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { LogFatal("socket() failed"); } memset(&serverAddress, 0, sizeof(serverAddress)); serverAddress.sin_family = AF_INET; serverAddress.sin_addr.s_addr = inet_addr(serverIPAddress); serverAddress.sin_port = htons(serverPort); int on = 1; if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (const char *) &on, sizeof(on)) < 0) { LogFatal("setsockopt() failed"); } if (connect(socketfd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) { LogFatal("connect() failed"); } fileNameLen = strlen(fileName); if (send(socketfd, fileName, fileNameLen, 0) != fileNameLen) { LogFatal("send() sent a different number of bytes than expected"); } totalBytesRcvd = 0;#if DEBUG fprintf(stderr, "Received: \n");#endif for (;;) { bytesReceived = recv(socketfd, serverResponseBuffer, RCVBUFSIZE, 0); totalBytesRcvd += bytesReceived; // printf("%.*s", bytesReceived, serverResponseBuffer); if (bytesReceived < RCVBUFSIZE) { break; } }#if DEBUG fprintf(stderr, "\n");#endif close(sock); });
0 0
- 用宏定义的形式书写代码块
- 定位代码块中错误常用的宏定义
- main方法的书写形式
- 关于宏定义的形式
- 去除c代码里面的宏定义代码块的程序
- vue组件的3种书写形式
- C++程序的构成和书写形式
- 数据结构的形式定义
- 数组的定义形式
- 代码书写的格式
- 书写代码的规范性
- 书写正确的代码
- if代码块中定义的变量的释放时机
- 代码块内定义的变量外部可见
- IOS中得block代码块的定义及使用
- iOS之Block代码块的定义及使用
- IOS中得block代码块的定义及使用
- IOS中得block代码块的定义及使用
- 观察者模式(一),手动编码(参考仿造《Head First设计模式》)
- 回顾过去展望未来之2015
- ZOJ 3713 10th省赛 I In 7-bit【位运算】
- Collections.synchronizedList()不同锁造成的陷阱
- Data Binding 打造RecyclerView 万能适配器
- 用宏定义的形式书写代码块
- HDU 5533 Dancing Stars on Me [数学]
- HDU 5289 Assignment(2015 Multi-University Training Contest 1)
- 黄菡经典语录
- linux的root密码忘了解决办法
- Carmichael Numbers uva10006
- Android远程服务——AIDL
- Windows-Git和Github管理自己代码
- Oracle db 重做日志