当前位置: 首页 > 知识库问答 >
问题:

宏值的字符串化

贾飞章
2023-03-14

我遇到了一个问题--我需要同时使用一个string和Integer的宏值。

 #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”来处理它,但可以理解,我对此并不满意。

怎么把它弄对?

共有2个答案

潘哲
2023-03-14
#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_RECORDESS来计算参数,然后再对它们进行字符串化。

萧鹏云
2023-03-14

下面定义的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) ";"
 类似资料:
  • 问题 你想创建一个字符串,让它包含体现某个 CoffeeScript 变量的文本。 解决方案 使用 CoffeeScript 中类似 Ruby 的字符串插值,而不是 JavaScript 的字符串拼接。 插值: muppet = "Beeker" favorite = "My favorite muppet is #{muppet}!" # => "My favorite muppet is B

  • #include <stdio.h> int main(void) { char p1[] = "Sam"; char *p2 = "Bob"; printf("p1 is %s, p2 is %s\n", p1, p2); return 0; } 技巧 使用gdb调试程序时,可以用“set”命令改变字符串的值,以上面程序为例: (gdb) start Tem

  • 本文向大家介绍C语言宏是简单的字符串替换,包括了C语言宏是简单的字符串替换的使用技巧和注意事项,需要的朋友参考一下 示例 宏是简单的字符串替换。(严格来说,它们使用预处理令牌,而不是任意字符串。) 您可能希望此代码可以打印9(3*3),但实际上5会被打印,因为宏将扩展为1+2*1+2。 您应该将参数和整个宏表达式括在括号中,以避免出现此问题。 另一个问题是,不能保证对宏的参数进行一次评估。它们可能

  • 在普通字符串中,我可以用反斜杠转义: 在字符串文字中有可能做同样的事情吗?反斜杠不再是转义字符: 到目前为止,我看到的唯一解决方案是字符串连接,这非常难看,以及嵌套插值,这开始变得有点可笑:

  • 问题内容: 如何获取os.Error的字符串值?即。分配给变量。 问题答案: 例如, 输出: