Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
宏:从char literal到string literal_C_C Preprocessor - Fatal编程技术网

宏:从char literal到string literal

宏:从char literal到string literal,c,c-preprocessor,C,C Preprocessor,在C语言中,有没有一种方法可以使用宏从字符文字创建字符串文字 比如我有 'a' 我想创建字符串文字 "a" 为澄清问题: #define A 'a' write(fd, "x=" CHAR2STRING(A) "\n", 4); 我的问题是如何定义宏CHAR2STRING不是很优雅,但它可以工作: #define STRING_ME(tgt, ch) tgt[0]=ch;tgt[1]='\0' 假设tgt有2个字符的空间。也许你可以举一个你想要它看起来像什么的例子?你可以这样做 #d

在C语言中,有没有一种方法可以使用宏从字符文字创建字符串文字

比如我有

'a'
我想创建字符串文字

"a"

为澄清问题:

#define A 'a'

write(fd, "x=" CHAR2STRING(A) "\n", 4);

我的问题是如何定义宏CHAR2STRING

不是很优雅,但它可以工作:

#define STRING_ME(tgt, ch) tgt[0]=ch;tgt[1]='\0'
假设tgt有2个字符的空间。也许你可以举一个你想要它看起来像什么的例子?

你可以这样做

#define A 'a'
#define X(macro) #macro
#define CHAR2STRING(macro) X(macro)

printf("%s\n", CHAR2STRING(A));
你会得到“a”而不是a,但也许这对你来说没关系。

-问题评论摘要-

这似乎不可能实现。或者,可以定义字符串文字,并编写
STRING2CHAR
宏:

#define A "a"
#define STRING2CHAR(s) (*(s))
write(fd, "x=" A "\n", 4);
putchar(STRING2CHAR(A));

表达式
*“a”
不是编译时常量(例如,它不能用作具有非自动存储持续时间、非VLA数组长度、大小写标签或位字段宽度的对象的初始值设定项),尽管编译器应该能够在编译时对其进行评估(使用Gcc和Clang进行测试)



由和建议。

内联宏?(无var数据)?我也很好奇,一个是两个
char
wide,另一个是一个。您建议将第二个字符(终止符)存储在哪里?甚至连一个eval'ing作为地址都没有,这仍然需要解决。@WhozCraig-它应该在编译时进行评估。我希望它的存储方式与我在代码中直接使用“a”的方式相同(并且没有指示编译器生成它)。并且
a
宏必须是字符文本,不能是其他字符,比如97或0x61?你不能反过来做吗?把
A
变成一个字符串文字,然后写一个
STRING2CHAR(A)
宏作为
A
的其他用途?我认为这是不可能的。但是,您可以定义
a
,然后从中生成
'a'
@mafso
*“a”
,而不是
'a'
@mafso:正确,但答案早于示例,稍后添加示例以澄清。
#define A a
#define XSTR(s) #s
#define SYM2CHAR(sym) (*XSTR(sym))
#define SYM2STRING(sym) XSTR(sym)