6

typedef私はスレッドプールに取り組んでおり、長い修飾子名を避けるために宣言を使用したいと考えています。

しかし、それは思ったほど簡単ではありません。

typedef unsigned ( __stdcall *start_address )( void * ) task;

その方法で試してみたところ、次のようになりました。

error C3646: 'task' : unknown override specifier

エラー、この宣言でしばらく遊んだ後、行き詰まり、そのようなタイプの を宣言するために使用する合理的な解決策が見つかりませんtypedef

4

3 に答える 3

15

typedef関数ポインターのエイリアスを作成する場合、エイリアスは関数の位置にあるため、次を使用します。

typedef unsigned (__stdcall *task )(void *);

taskは、次の型エイリアスになりました:ポインターを受け取り、返す関数へのvoidunsignedポインター。

于 2012-08-30T13:21:55.510 に答える
7

hmjdの回答が削除されたため...

C++11 では、このようなことをより簡単にするために、まったく新しいエイリアス構文が開発されました。

using task = unsigned (__stdcall*)(void*);

to と同等ですtypedef unsigned (__stdcall* task)(void*);(関数シグネチャの真ん中にあるエイリアスの位置に注意してください...)。

テンプレートにも使用できます。

template <typename T>
using Vec = std::vector<T>;

int main() {
    Vec<int> x;
}

この構文は古いものよりもかなり優れています (そして、テンプレートの場合、実際にテンプレートのエイリアシングが可能になります) が、かなり新しいコンパイラが必要です。

于 2012-08-30T13:48:59.677 に答える
0

補足: この__stdcall部分は、異なるコンパイラ/コンパイラ設定でコードを壊す可能性があります (関数が明示的に宣言されていない限り__stdcall)。私は、正当な理由がある独自のコンパイラ拡張機能のみを使用して、デフォルトの呼び出し規約に固執します。

于 2012-08-30T14:21:34.023 に答える