宏值的字符串化

宏值的字符串化

我遇到了一个问题 - 我需要使用宏值作为字符串和整数。

 #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"但可以理解的是,我对它并不满意。

怎么做对吗?


呼唤远方
浏览 539回答 3
3回答

长风秋雁

下面xstr定义的宏将在进行宏扩展后进行字符串化。#define xstr(a) str(a)#define str(a) #a#define RECORDS_PER_PAGE 10#define REQUEST_RECORDS \    "SELECT Fields FROM Table WHERE Conditions" \    " OFFSET %d * " xstr(RECORDS_PER_PAGE) \    " LIMIT " xstr(RECORDS_PER_PAGE) ";"

肥皂起泡泡

#include <stdio.h>#define RECORDS_PER_PAGE 10#define TEXTIFY(A) #A#define _REQUEST_RECORDS(OFFSET, LIMIT)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\&nbsp; &nbsp; &nbsp; &nbsp; "SELECT Fields FROM Table WHERE Conditions"&nbsp; &nbsp; &nbsp;\&nbsp; &nbsp; &nbsp; &nbsp; " OFFSET %d * " TEXTIFY(OFFSET)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\&nbsp; &nbsp; &nbsp; &nbsp; " LIMIT " TEXTIFY(LIMIT) ";"#define REQUEST_RECORDS _REQUEST_RECORDS(RECORDS_PER_PAGE, RECORDS_PER_PAGE)int main() {&nbsp; &nbsp; &nbsp; &nbsp; printf("%s\n", REQUEST_RECORDS);&nbsp; &nbsp; &nbsp; &nbsp; return 0;}输出:SELECT Fields FROM Table WHERE Conditions OFFSET %d * 10 LIMIT 10;注意间接到_REQUEST_RECORDS以在对字符串进行字符串化之前评估参数。

尚方宝剑之说

尝试双重转义你的报价#define RECORDS_PER_PAGE 10#define MAX_RECORD_LEN 10&nbsp;/*... */#define DOUBLEESCAPE(a) #a#define ESCAPEQUOTE(a) DOUBLEESCAPE(a)#define REQUEST_RECORDS \&nbsp; &nbsp; &nbsp; "SELECT Fields FROM Table WHERE Conditions" \&nbsp; &nbsp; &nbsp; " OFFSET %d * " ESCAPEQUOTE(RECORDS_PER_PAGE)&nbsp; &nbsp; &nbsp; &nbsp;\&nbsp; &nbsp; &nbsp; " LIMIT " ESCAPEQUOTE(RECORDS_PER_PAGE) ";"&nbsp;char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];int main(){&nbsp; char * a = REQUEST_RECORDS;}编译给我。令牌RECORDS_PER_PAGE将通过ESCAPEQUOTE宏调用进行扩展,然后将其发送到DOUBLEESCAPE引用中。
打开App,查看更多内容
随时随地看视频慕课网APP