11

Cプリプロセッサにマクロを生成してもらいたいのですが (つまり、C99 だけを使用しています)。マクロを書きます

#define make_macro(in) <...magic here...>

そして私が置くとき

make_macro(name1)
make_macro(name2)

コードの後半では、次のように展開されます。

#define name1(...) name1_fn(name1_info, __VA_ARGS__)
#define name2(...) name2_fn(name2_info, __VA_ARGS__)

そして、name1 と name2 を (マクロ実装された) 関数として使用できるようになります。私は両方のステップでマクロを使用して立ち往生していると思います.テンプレートを繰り返し再入力するためにマクロを使用することは理にかなっています.マクロを使用しない限り、可変引数の処理は機能しません.

では、これを行うために <...magic here...> プレースホルダーには何が入りますか? この時点で、私は C99 では不可能であると信じ始めていますが、構文の詳細が欠けている可能性があります。

4

6 に答える 6

9

標準 C では不可能です。

于 2009-05-13T20:37:05.150 に答える
7

M4 マクロの使用を検討しましたか? ほとんどのプラットフォームで利用できると思いますので、制限はありません。

M4 GNU ページ

于 2009-05-14T03:06:07.720 に答える
4

誰もが言っているように、あなたが求めていることを正確に行うことはできません。

たとえば、メイクファイルで次のようなルールを使用して、C プリプロセッサを強制的に 2 回実行することで、そのようなことができる場合があります。

.c.pp:
   $(CPP) $< -o $@

次に、ファイルに test.pp の拡張子を付けます。Makefile はそれを 1 回実行して .c ファイルを生成し、次に .c ファイルの通常の実行で 2 回実行します。

個人的には、Perl などで外部スクリプトを作成して C コードを生成したいと考えています。C プリプロセッサでゲームをプレイするよりも少しクリーンです。それは、話しているコードの量によって異なります。

于 2009-05-14T04:20:58.600 に答える
3

マクロは一度しか実行されないため、不可能です。

これは、マクロで他のマクロを使用できなかったという意味ではありませんが、実行できませんでした

#define TEST #define HALLO 33

int x = TEST;

その後、x が 33 になることを期待してください! あなたがしようとしたので、あなたが得るのは構文エラーです

int x = #define HALLO 33;

または、コンパイラが #define 内の #define についてすでに不平を言っている可能性があります。

于 2009-05-13T20:41:10.853 に答える
0

試してみてください#define make_macro(name,...) name##_fn(name##_info, __VA_ARGS__)

次のように使用します。

make_macro(name1)
make_macro(name2,1)

そしてこれは生成するでしょう

name1_fn(name1_info)
name2_fn(name2_info,1)
于 2009-05-13T20:40:55.860 に答える