3

プラットフォームに依存しないソケット ライブラリを作成しています。基本的なファイル構造は次のようになります。

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

ヘッダー ファイルには、#includeオペレーティング システム全体で共通の が含まれます。ソース ファイルの#includeプラットフォーム固有のライブラリ。

このようなプロジェクトを数多く構築してきましたが、ソケットの問題に直面しています。関数パラメータのデフォルト値を指定しているため、、、などのヘッダー ファイルで使用header.hするプラットフォーム固有のライブラリが必要です。#definesSOCK_STREAMAF_INETSOMAXCONN

現在、ヘッダー ファイルでステートメントを使用したくありません。#ifdef _WIN32すべてのプラットフォーム固有のコードを別のフォルダーのソース ファイルに配置したいからです。

私は基本的に岩と固い場所の間で立ち往生していますか? #ifdef #includesヘッダーに依存する#defines相互に排他的なデフォルトのパラメーター値を回避および指定していますか?

4

3 に答える 3

2

プラットフォームに依存しないヘッダーで宣言され、プラットフォーム固有の .cpp ファイルで適切に定義されている関数を介して取得することにより、既定のパラメーターを取得できます。

または、プラットフォームに依存しないヘッダーで extern const として宣言し、プラットフォーム固有の .cpp で適切に定義することもできます。

于 2012-07-16T14:40:16.427 に答える
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);
}

もう 1 つの可能性は、プロトタイプでパラメーターを欠落させておくことです。

/* 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 に答える
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 に答える