宏值的字符串化

SF.*_*SF. 32 c string concatenation c-preprocessor

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

 #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... */
Run Code Online (Sandbox Code Playgroud)

这失败了一条关于"stray#"的消息,即使它有效,我想我会得到字符串化的宏名称,而不是值.当然,我可以将值提供给最终的方法("LIMIT %d ", page*RECORDS_PER_PAGE),但它既不漂亮也不高效.当我希望预处理器不以特殊方式处理字符串并且像普通代码一样处理它们的内容时,就像这样.就目前而言,我对它进行了解决,#define RECORDS_PER_PAGE_TXT "10"但可以理解的是,我对它并不满意.

怎么做对吗?

Mat*_*ler 52

下面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) ";"
Run Code Online (Sandbox Code Playgroud)

  • 这是最近的要求吗?我不记得上次使用字符串时需要这样的技巧...... (2认同)
  • 更新了GCC文档链接:https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html#Stringizing (2认同)

Mik*_*ler 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

SELECT Fields FROM Table WHERE Conditions OFFSET %d * 10 LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

请注意 _REQUEST_RECORDS 的间接性,以在对参数进行字符串化之前对其进行评估。