2

なぜこれまでCでテンプレートを実装する次の方法を見たことがないのか疑問に思います。私のアイデアは、プリプロセッサをテンプレート作業にすることでした。

container.h

#ifndef TEMPLATE_TYPE
    #error "missing decalaration TEMPLATE_TYPE"
#endif

#define _CONCAT(a, b) a##b
#define _EVALUATOR(a, b) _CONCAT(a, b)
#define MAKE_NAME(a, b) _EVALUATOR(a, b)

typedef struct {
    TEMPLATE_TYPE   data;
} MAKE_NAME(Container_, TEMPLATE_TYPE);

main.c

#define TEMPLATE_TYPE int
#include "container.h"

int main() {
    Container_int c;
    c.data = 99923;
}

それで、どうしたのですか?

  1. これは単に「悪いスタイル」と見なされます
  2. 誰もそれについての記事を書かないことは非常に明白です
  3. たくさんの記事があります、ただグーグルマン!

#3で答える予定がない場合は、このテクニックについてコメントをいただければ幸いです。

4

2 に答える 2

5

プリプロセッサを使用すると、信じられないほどのこと(善と悪)を行うことができます。それが悪いスタイルと見なされるかどうかは判断の呼びかけであり、結果として得られるコードの品質、可読性、および保守性に大きく依存します。複雑なプリプロセッサマクロは、作成、デバッグ、および保守するのが面倒です。ただし、最適なCコードは、作成しないコードであり、マクロは、テーマのバリエーションを自動的に生成するのに最適です。

プリプロセッサ(乱用)の使用の良い例を次に示します。

SimpleScalarコードは、上記の提案のようなパターンを使用します。ここで、#includeの前に#defineがあり、ヘッダーに方向性を与えます。

プリプロセッサの本格的な使用を検討している場合は、Boostプリプロセッサライブラリを確認する必要があります。(BoostのC ++ルートに惑わされないでください。プリプロセッサマクロはCで正常に動作します。)

于 2012-06-22T22:18:38.387 に答える
3

それ以外の

typedef struct {
    TEMPLATE_TYPE   data;
} MAKE_NAME(Container_, TEMPLATE_TYPE)

あなたがしたいかもしれません

#define MAKE_CONTAINER(type) typedef struct MAKE_NAME(Container_, type) { type data; } MAKE_NAME(Container_, type)

できるようにするために

#include "container.h"
MAKE_CONTAINER(int);
MAKE_CONTAINER(double);

int main() {
    Container_int c; // one way to go
    struct Container_double d; // my preferred way: don't typedef when not needed; let the structs be obvious.

    c.data = 99923;
    d.data = 3.5;
}
于 2012-06-22T22:28:30.613 に答える