ルックアップマクロを作成しようとしています。三項演算子を使うことは、これを行うための非常に簡潔な方法のようです。ここで私がこれまで持っているものです。マクロ拡張3進ルックアップテーブル
#define SQL_LOOKUP_TABLE(x) (strncmp(x, "int", strlen(x)) == 0) ? "INTEGER" : SQL_LOOKUP_TABLE1(x)
#define SQL_LOOKUP_TABLE1(x) (strncmp(x, "char", strlen(x)) == 0) ? "TEXT" : SQL_LOOKUP_TABLE2(x)
#define SQL_LOOKUP_TABLE2(x) (strncmp(x, "double", strlen(x)) == 0) ? "REAL" : ""
は、私はC言語で文字列としてタイプを渡し、その後、対応するSQL文字列として型バック取得したいです。 、私は本当に何をしたいのか
printf("Ternary test: %s\n", SQL_LOOKUP_TABLE("double")); //output "REAL"
この情報を取得し、全体のSQLのCRUDステートメントを構築である:それは私がこのような何かをしたときに素晴らしい作品。この問題は、別のマクロの内部に文字列を作成しようとすると発生します。このような何かが動作しません:
#define BUILD_A_STRING(x) "CREATE TABLE (" SQL_LOOKUP_TABLE(x)
私が取得エラー:
error C2064: term does not evaluate to a function taking 337 arguments
クイックノートで、これは動作しません(リターンを "REAL"):
#define BUILD_A_STRING(x) SQL_LOOKUP_TABLE(x)
任意のアイデアなぜ私ができます別のマクロの中でマクロを呼び出したり、文字列を作成したりすることはできません。
編集(TMIを提供するリスクのある): これは私が本当に何をしたいです:
typedef struct {
double yomama;
int x;
char shiboopy[100];
} test_data1;
#define EXPAND_AS_CREATE_STATEMENT(type, element, struct_name) SQL_LOOKUP_TABLE(#type) " " # element ", "
#define test_data1_TABLE(ENTRY) \
ENTRY(double, yomama, test_data1) \
ENTRY(int, x, test_data1) \
ENTRY(char, shiboopy, test_data1)
char* create_stmt = "CREATE TABLE test_data1 (" test_data1_TABLE(EXPAND_AS_CREATE_STATEMENT) ");"; \
は、基本的に何でもCRUDにそれを展開し、構造体のデータ型を定義するためにXマクロを使用し、私が必要とするかもしれない陳述。
どのように 'BUILD_A_STRING'を使用しようとしていますか? –
あなたのコンパイラには、前処理のみを行うオプションがあり、展開を見ることができます。それを試してみて.....そして、なぜ機能を作るだけではないのですか?マクロを使用すると、多くの場合、exeファイルが膨大になることがあります。 –
'337個の引数をとる関数に評価されない 'は、何とか閉じ括弧を緩めてしまったことを伝えます。 – Serge