【发布时间】:2011-02-08 20:09:59
【问题描述】:
我遇到了一个问题 - 我需要将宏值用作字符串和整数。
#define RECORDS_PER_PAGE 10
/*... */
#define REQUEST_RECORDS \
"SELECT Fields FROM Table WHERE Conditions" \
" OFFSET %d * " #RECORDS_PER_PAGE \
" LIMIT " #RECORDS_PER_PAGE ";"
char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];
/* ...and some more uses of RECORDS_PER_PAGE, elsewhere... */
这会失败并显示有关“stray #”的消息,即使它有效,我想我也会得到字符串化的宏名称,而不是值。当然,我可以将值提供给最终方法("LIMIT %d ", page*RECORDS_PER_PAGE),但它既不美观也不高效。
在这种情况下,我希望预处理器不以特殊方式处理字符串,而是像处理普通代码一样处理它们的内容。
目前,我将其与#define RECORDS_PER_PAGE_TXT "10" 联系在一起,但可以理解的是,我对此并不满意。
如何做到正确?
【问题讨论】:
-
在 gcc 上为我正确预处理。
-
我会重新考虑其中的
"%d",以支持仅基于一般原则的查询变量。"%d"不太容易受到注入攻击,但这似乎是一个坏习惯。
标签: c string concatenation c-preprocessor