灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2461回复:0

C语言个人进阶

楼主#
更多 发布于:2012-09-06 12:30


争取把自己的一点一滴记下来-
1. 跨平台开发
1) 头文件包含
通过define开关包含不同的库,定义函数类型
#ifndef WIN32
#include "socket_posix.h"
#else  /* WIN32 */
#include "socket_win32.h"
#endif  /* !WIN32 */
结尾应该注明if适用情况。

2) 替换函数
#undef  errno
#define errno  WSAGetLastError()
#define read(fd, buf, size)  recv(fd, buf, size, 0)

2. 常用宏
今天看到非常漂亮的一个应用:
利用宏##实现了IPv4和IPv6地址信息的初始化
#define FILL_SOCKADDR(AF_INET, sockaddr_in, sin, s,             \
                      host, port, count, addrlen, addrs)        \
  do                                                            \
    {                                                           \
      struct sockaddr_in *addr;                                 \
      int i;                                                    \
                                                                \
      addrlen = sizeof(struct sockaddr_in);                     \
                                                                \
      addr = (struct sockaddr_in *) calloc(count, addrlen);     \
      for (i = 0; i < count; ++i)                               \
        {                                                       \
          addr.sin##_family = AF_INET;                       \
          addr.sin##_port = port;                            \
          memcpy(;addr.sin##_addr.s##_addr,                  \
                 ADDR(host, i), host->h_length);                \
        }                                                       \
                                                                \
      addrs = (char *) addr;                                    \
    }                                                           \
  while (0)

#define fill_sockaddr(host, port, count, addrlen, addrs)        \
  FILL_SOCKADDR(AF_INET, sockaddr_in, sin, s,                   \
                host, port, count, addrlen, addrs)

#ifdef AF_INET6
#define fill_sockaddr6(host, port, count, addrlen, addrs)       \
  FILL_SOCKADDR(AF_INET6, sockaddr_in6, sin6, s6,               \
                host, port, count, addrlen, addrs)
#endif  /* AF_INET6 */





喜欢0 评分0
游客

返回顶部