我遇到了一个问题--我需要同时使用一个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”
来处理它,但可以理解,我对此并不满意。
怎么把它弄对?
#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来计算参数,然后再对它们进行字符串化。
下面定义的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的字符串值?即。分配给变量。 问题答案: 例如, 输出: