2017-03-29 8 views
0

動的関数のために、関数とマクロを動的に定義する必要があります。後続のコードは正常に動作しますが、最初のマクロの中にマクロを追加しようとすると失敗します。 が必要な行動マクロの動的定義

#define INIT_PATH_FUNCTION(UCI_PATH, DPATH) \ 
struct ctx *ctx_##_PATH; \ 
int print##_PATH(char *package) \ 
{\ 
    print("package %s \n", package); \ 
    return 0; \ 
}\ 
#define foreach_file_##PATH(path) \ 
    for (section = print##_PATH(path); \ 
     section != NULL; \ 
     section = print##_PATH(path))\ 

#define PRINT(UCI_PATH, path) print##_PATH(path) 


INIT_PATH_FUNCTION(test, "/etc/") 
INIT_PATH_FUNCTION(test2, "/root/") 
+1

「ダイナミック」と「マクロ」はうまくいっていません。前処理は、ループが実行される前に実行されています。それとも、コンパイルされている。 –

答えて

0

を得るためにそこ方法です私はその後、私はあなたが不満のために運命づけられている怖い動的

機能やマクロを定義する必要があります。置換テキストにマクロの呼び出しが含まれています。マクロを展開すると、定義マクロを生成することはできません。最終的には、部分的には、ダウンと言い標準のparagraph 6.10/2に来る

前処理指令は、以下の制約を満たす前処理 トークンのシーケンスで構成されています の最初のトークンは、シーケンスが#前処理であります 翻訳フェーズ4の先頭の)は、ソースファイル の最初の文字(改行文字を含まない空白文字の後にオプションである)か、少なくとも1つの改行文字を含む空白文字に続く です。 。

(強調は追加。)

あなたはマクロ定義の形を持っているマクロ置換テキストを与えることができますが、置換テキストは、あらゆる種類の前処理指令であるための要件を満たしていません翻訳フェーズ4の開始(前処理指令が実行される)。マクロの展開が遅すぎるので、そのようなフォームのテキストを生成することは無関係です。


ただし、関数定義(および宣言)は別の問題です。必要に応じてこれらのマクロを使って生成することもできますが、定型的なコードを多数使用して複数の異なる関数が必要な場合は、これは妥当なことです。