【发布时间】:2018-01-03 17:46:57
【问题描述】:
我正在尝试创建一个查找宏。使用三元运算符似乎是一种非常简洁的方法。到目前为止,这是我所拥有的:
#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) ");"; \
基本上使用 X 宏来定义结构的数据类型,然后将其扩展为我可能需要的任何 CRUD 语句。
【问题讨论】:
-
你如何尝试使用
BUILD_A_STRING? -
您的编译器应该有一个仅预处理选项,允许您查看扩展。试试看.....而且,为什么不直接创建一个函数呢?使用宏,你可能会得到大量重复的代码,可能会使 exe 膨胀。
-
not evaluate to a function taking 337 arguments告诉我你设法以某种方式松开了右括号。
标签: c macros c-preprocessor