可能重复:
如何在C中对表达式进行字符串化
我希望我能在这里找到解决问题的方法.
我想添加ADD1中定义的十六进制数字,并且需要以*str字符串形式输入相同的数字.
这只是一个例子,首先证明它的可能性.我实际上是在头文件中做同样的事情.
#include <stdio.h>
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)
#define ADD1 0x6000+0x10
main()
{
char *str = "START " MK_STR(ADD1) "\n";
printf(str);
}
Run Code Online (Sandbox Code Playgroud) 一元运算符通常以比二元运算符更高的优先级进行解析,并且当从左到右扫描时,将首先找到前缀运算符。那么为什么 stringize ( #) 运算符的计算顺序相对于连接 ( ##) 运算符是未指定的呢?评估顺序是否意味着与 [cpp.stringize] \xc2\xa716.3.2 上下文中的优先级不同?
(预处理器没有副作用,因此从技术上讲,它没有评估顺序之类的东西。)
\n\n考虑到任何替代方案都会字符串化串联结果,而不是参数本身,文本“替换为包含相应参数的预处理标记序列的拼写的单个字符串文字预处理标记”的文本如何与其他优先级相匹配?
\n\n是否有任何实现做了一些有趣的事情,或者可以安全地删除评估文本的顺序并替换为“#运算符比运算符具有更高的优先级##”?
该问题已交叉发布到标准讨论邮件列表,但请更愿意在此处回复。
\n\n注意:我计划起草一份官方提案来修改这部分 C++ 规范,所以请分享您的知识!潜在的动机是使预处理器更具确定性。
\n让我们
class Item{
public:
Item(int id,const char *name,const char *props=NULL);
};
Run Code Online (Sandbox Code Playgroud)
我想写:
ITEM(1,FIRST);
ITEM(2,SECOND, WithSomeProps);
Run Code Online (Sandbox Code Playgroud)
用宏
#define ITEM(ID,NAME,...) new Item(ID,NAME, #__VA_ARGS__ )
Run Code Online (Sandbox Code Playgroud)
这#__VA_ARGS__在 gcc 上编译得很好,但在 VStudio 上会出错。是否有可靠且便携的解决方案?
我想ITEM()在 .h 文件中有一个集合,该文件将被多次包含在不同的 #definitions of .h 文件中ITEM。
关于重载字符串以及它如何与utf8标志交互,我有些不明白的地方.
例如,以下代码打印:
n is utf8 at ./test_stringify_utf8.pl line 46.
$t->{name} is utf8 at ./test_stringify_utf8.pl line 47.
t is not utf8 at ./test_stringify_utf8.pl line 48.
Dervi?
t is utf8 at ./test_stringify_utf8.pl line 50.
Run Code Online (Sandbox Code Playgroud)
如果我删除say $t,最后一行输出也是t is not utf8
#!/usr/bin/env perl
use utf8;
use Encode qw/is_utf8/;
use strict;
use Modern::Perl '2013';
package Test;
use strict;
sub new {
my ($class, $name) = @_;
my $self = { name => $name };
bless $self, $class;
return $self;
}
BEGIN { …Run Code Online (Sandbox Code Playgroud) 在其中一个关于如何在C中将int转换为字符串的答案(及其注释)中, 给出了以下解决方案
char str[ENOUGH];
sprintf(str, "%d", 42);
Run Code Online (Sandbox Code Playgroud)
在评论CAF提到,ENOUGH可以在编译时间确定:
#define ENOUGH ((CHAR_BIT * sizeof(int) - 1) / 3 + 2)
Run Code Online (Sandbox Code Playgroud)
我得到了+ 2因为你需要能够显示减号和空终止符但是其他部分背后的逻辑是什么?特别CHAR_BIT?
我已经看过这个主题,通过这样做来描述"stringify"操作:
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)
Run Code Online (Sandbox Code Playgroud)
是否可以使用前导零进行字符串化?假设我的MAJOR_REV在这种情况下需要两个字符"02",MINOR_REV 4个字符"0006"如果我这样做:
#define MAJOR_VER 02
#define MINOR_VER 0006
Run Code Online (Sandbox Code Playgroud)
这些值将被视为应用程序中其他位置的八进制,这是我不想要的.
给定一个编译时常量整数(一个对象,而不是一个宏),我可以在编译时将它与字符串文字结合起来,可能还有预处理器吗?
例如,我可以通过将它们放在彼此相邻的位置来连接字符串文字:
bool do_stuff(std::string s);
//...
do_stuff("This error code is ridiculously long so I am going to split it onto "
"two lines!");
Run Code Online (Sandbox Code Playgroud)
大!但是如果我在混合中添加整数常量怎么办:
const unsigned int BAD_EOF = 1;
const unsigned int BAD_FORMAT = 2;
const unsigned int FILE_END = 3;
Run Code Online (Sandbox Code Playgroud)
是否可以使用预处理器以某种方式将其与字符串文字连接?
do_stuff("My error code is #" BAD_EOF "! I encountered an unexpected EOF!\n"
"This error code is ridiculously long so I am going to split it onto "
"three lines!");
Run Code Online (Sandbox Code Playgroud)
如果那是不可能的,我可以将常量字符串与字符串文字混合使用吗?即如果我的错误代码是字符串,而不是unsigneds?
如果两者都不可能,那么将这种字符串文字和数字错误代码组合在一起的最短,最干净的方法是什么?
c++ concatenation string-literals stringification c-preprocessor
我有一个宏,我在其中传递一个参数并使用它根据输入的名称定义一个新变量:
#define DO_X(x) char _do_x_var_ ## x; /* other things */
Run Code Online (Sandbox Code Playgroud)
问题是如果我传入一个结构变量,它就会崩溃:
DO_X(some_struct->thing)
Run Code Online (Sandbox Code Playgroud)
变成:
char _do_x_var_some_struct->thing; /* other things */
Run Code Online (Sandbox Code Playgroud)
编辑:我希望它评估的是:
char _do_x_var_some_struct__thing; /* other things */
Run Code Online (Sandbox Code Playgroud)
(或任何包含与输入类似的内容的有效变量名称)
我真正想要的是让这些工作:
#define DO_X(x) for(char _do_x_var_ ## x; /*things*/)
DO_X(x){
DO_X(y) {
/*things*/
}
}
DO_X(object->x){
DO_X(object->y) {
/*things*/
}
}
Run Code Online (Sandbox Code Playgroud)
但要使这些失败:
#define DO_X(x) for(char _do_x_var_ ## x; /*things*/)
DO_X(x){
DO_X(x) { // <-- multiple definition of _do_x_var_x
/*things*/
}
}
DO_X(object->x){
DO_X(object->x) { // <-- multiple definition of _do_x_var_object__x (or whatever)
/*things*/ …Run Code Online (Sandbox Code Playgroud) c macros string-concatenation stringification c-preprocessor
我试图解决两个预处理器相关的问题,但在这两个程序中,我得到的结果是我无法弄清楚如何.以下是我的计划:
#include<stdio.h>
#define SQUARE(x) x*x
int main()
{
float s=10,u=30 ,t=2,a;
a=2*(s-u*t)/SQUARE(t);
printf("Result:%f\n",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我说,这个程序的输出应该是,-25.000但我得到了-100.000.
在第二个程序中:
#define FUN(i,j) i##j
int main()
{
int val1 = 10;
int val12 = 20;
clrscr();
printf("%d\n",FUN(val1,2));
getch();
}
Run Code Online (Sandbox Code Playgroud)
输出应该是,102但我得到20; 为什么会这样?
为了纠正错别字,并添加我忘记提及的问题,这里是宏:
#define SUFFIX .new
#define STR(x) #x
#define GENFILE(name,suff) STR(timings/name suff)
GENFILE(test1, SUFFIX)
Run Code Online (Sandbox Code Playgroud)
上面的代码生成timings/test1 .new,如果我没有那个额外的空间,我会得到我想要的,我该如何绕过它?
stringification ×10
c ×6
c++ ×3
macros ×2
c-strings ×1
char ×1
int ×1
overloading ×1
perl ×1
utf-8 ×1