3

我正在编写一个独立于平台的套接字库。基本的文件结构是这样的:

source directory
|_________________________
|            |            |
v            v            v    
header.hpp   win32        linux
             |            |
             v            v
             source.cpp   source.cpp

头文件包含#include跨操作系统通用的任何 s。源文件#include平台特定的库。

我已经建立了很多这样的项目,但是我遇到了套接字的问题。因为我正在为函数参数指定默认值,所以需要在头文件header.h中使用特定于平台的库,例如、和.#definesSOCK_STREAMAF_INETSOMAXCONN

现在,我不想#ifdef _WIN32在我的头文件中使用语句,因为我希望所有特定于平台的代码都位于单独文件夹中的源文件中。

我是否基本上被困在岩石和坚硬的地方之间?是否避免#ifdef #includes和指定与标头相关的默认参数值是#defines互斥的?

4

3 回答 3

2

您可以使用通常无效的其他默认值。然后,您的平台特定代码可以检测到这个特殊的默认值,并将该值替换为您实际希望它表示的值。

/* header */
int mysocket (int domain = -1, int type = -1, int protocol = 0);

/* implementation */
int mysocket (int domain, int type, int protocol) {
    if (domain == -1) domain = AF_INET;
    if (type == -1) type = SOCK_STREAM;
    // ...wrapper specific stuff for the platform...
    return ::socket(d, t, p);
}

另一种可能性是在原型中遗漏参数。

/* header */
int mysocket ();
int mysocket (int domain);
int mysocket (int domain, int type);
int mysocket (int domain, int type, int protocol);

/* implementation */
int mysocket () { return mysocket(AF_INET, SOCK_STREAM, 0); }
int mysocket (int d) { retrun mysocket(d, SOCK_STREAM, 0); }
int mysocket (int d, int t) { return mysocket(d, t, 0); }
int mysocket (int d, int t, int p) {
    // ...wrapper specific stuff for the platform...
    return ::socket(d, t, p);
}
于 2012-07-16T14:28:16.983 回答
2

您可以通过在独立于平台的标头中声明并在特定于平台的 .cpp 文件中适当定义的函数检索默认参数来获取默认参数。

或者,您也可以在独立于平台的标头中将它们声明为 extern const,并在特定于平台的 .cpp 中适当地定义它们。

于 2012-07-16T14:40:16.427 回答
1

在您的库中添加一个抽象层,该层被转换为平台本机类型。

namespace MySocketLibrary
{
    enum SocketType
    {
        StreamSocket,
        DataGramSocket,
        RawSocket,
        // etc.
    }
}

对于我的平台特定Win32实现,然后:

int translate_socket_type(const MySocketLibrary::SocketType socket)
{
    switch(socket)
    {
        case  MySocketLibrary::StreamSocket:
            return 1;
        // etc.
    }
}

许多图书馆(如boost::asio)都这样做。

于 2012-07-16T15:05:30.103 回答