为了账号安全,请及时绑定邮箱和手机立即绑定

宏值的字符串化

宏值的字符串化

C
呼唤远方 2019-08-09 10:24:33
宏值的字符串化我遇到了一个问题 - 我需要使用宏值作为字符串和整数。 #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"但可以理解的是,我对它并不满意。怎么做对吗?
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

下面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) ";"


查看完整回答
反对 回复 2019-08-09
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

#include <stdio.h>


#define RECORDS_PER_PAGE 10


#define TEXTIFY(A) #A


#define _REQUEST_RECORDS(OFFSET, LIMIT)                 \

        "SELECT Fields FROM Table WHERE Conditions"     \

        " OFFSET %d * " TEXTIFY(OFFSET)                 \

        " LIMIT " TEXTIFY(LIMIT) ";"


#define REQUEST_RECORDS _REQUEST_RECORDS(RECORDS_PER_PAGE, RECORDS_PER_PAGE)


int main() {

        printf("%s\n", REQUEST_RECORDS);

        return 0;

}

输出:


SELECT Fields FROM Table WHERE Conditions OFFSET %d * 10 LIMIT 10;

注意间接到_REQUEST_RECORDS以在对字符串进行字符串化之前评估参数。


查看完整回答
反对 回复 2019-08-09
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

尝试双重转义你的报价


#define RECORDS_PER_PAGE 10

#define MAX_RECORD_LEN 10


 /*... */

#define DOUBLEESCAPE(a) #a

#define ESCAPEQUOTE(a) DOUBLEESCAPE(a)

#define REQUEST_RECORDS \

      "SELECT Fields FROM Table WHERE Conditions" \

      " OFFSET %d * " ESCAPEQUOTE(RECORDS_PER_PAGE)       \

      " LIMIT " ESCAPEQUOTE(RECORDS_PER_PAGE) ";"


 char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];


int main(){

  char * a = REQUEST_RECORDS;

}

编译给我。令牌RECORDS_PER_PAGE将通过ESCAPEQUOTE宏调用进行扩展,然后将其发送到DOUBLEESCAPE引用中。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 528 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信