问题标签 [stringification]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
10925 浏览

c - 在C中将任何变量转换为字符串

是否可以将任何类型的任何变量转换为字符串?

我写了以下

#define TO_STRING(val) #val

这是将变量转换为字符串的有效方法吗?

0 投票
1 回答
684 浏览

c++ - 字符串化运算符失败

C和 C++ 标准都包含文本,大意是如果字符串化操作未能生成有效的字符串文字标记,则行为未定义。在 C++11 中,这实际上是可能的,方法是在原始字符串文字中包含换行符。但标准中始终存在包罗万象的内容。

有没有其他方法可以使字符串化产生 UB,而 UB 或格式错误的程序还没有发生?

我很想听听C或 C++ 的任何方言。我正在一个预处理器。

0 投票
2 回答
124 浏览

c - 打印预处理器形成的变量标识符

如何检索从宏扩展的文本?

输出为:64,因为宏扩展为:

如何使用定义的粘贴宏将标识符 number2 打印为字符串。我需要知道如何 通过不直接写“number2”来创建输出: number2: 64我不想要这个解决方案

我想要一个动态的解决方案。我尝试通过以下方式连接:

但它不起作用,因为粘贴宏返回的 number2 是一个标识符,一个整数如何检索为文本(字符串)?

0 投票
2 回答
293 浏览

c - 将 C 宏定义字符串连接到文字字符串

让第一行是:

现在,我需要将它与文字字符串常量连接起来;类似的东西:

0 投票
2 回答
15457 浏览

c - C++的C预处理器宏中的#和##是什么意思

我阅读了以下代码:

我知道##运算符用于将两个字符串合并为一个,但是and#前面的呢?defabc

0 投票
1 回答
1922 浏览

c++ - 反向预处理器字符串化操作符

在一个 SDK 的一个包含文件中定义了许多宽字符串数字常量,我无法修改,但经常更新和更改。所以我不能用数字声明数字定义,因为它每隔几天就完全不同,我不想('不允许)应用任何脚本进行更新

如果反过来并且常量将被定义为一个数字,我可以简单地通过 # 预处理器运算符创建字符串。

我不会不使用 atoi 也不想制作任何变量,我只需要预处理器最好的数字形式的常量。

我知道没有反向字符串化运算符,但是没有任何方法可以通过预处理器将字符串转换为令牌(数字)吗?

0 投票
3 回答
12306 浏览

c - 使用 __VA_ARGS__ 定义字符串化宏时出错

我一直在尝试在 C 中实现一个函数宏,该函数宏在参数前面加上“DEBUG:”,并将其参数传递给 printf:

这在 gcc 中给了我这个错误:

据说,它应该对格式进行字符串化,并将其变量参数传递给 printf,但到目前为止我无法克服这个错误。


编辑

在放弃字符串化参数和双重哈希(##)之后,__VA_ARGS__我现在遇到了这个错误:

我应该在参数后加逗号吗?

作为参考,DBG() 现在看起来像这样:

0 投票
2 回答
66 浏览

c - 访问具有相似名称的标识符的宏

假设您有许多标识符,例如 UARTxREG(其中 x 是一个数字)。

有没有办法编写宏,例如:

这样这将扩展到:

我可以这样做是将文字数字(1、2、3 等)传递给宏,但是当我尝试传入宏时,我遇到了宏无法正确扩展的问题。

我目前有:

然而这并没有扩大channel

0 投票
1 回答
409 浏览

macros - 将宏的参数字符串化为 unicode

我正在尝试对宏的参数进行字符串化,以便它给出 unicode 字符串,即我想要得到以下内容:

我的宏是这样的:

不幸的是不起作用。这个怎么做?

0 投票
2 回答
2760 浏览

c++ - 如何对包含逗号的字符串进行字符串化?

我想在编译命令中传递一个版本字符串:

在我的代码中,我有以下内容:

这不起作用,因为VERSION宏中有一个逗号,所以看起来我正在传递两个参数TOSTR()(显然,宏只有在它作为一个唯一参数VERSION传递给之后才会被扩展)。STRINGIFY()

我在这里找到的以下方法也不起作用:

因为这似乎与

也就是说,宏CONCAT()不会被扩展。

注 1:我宁愿不在命令行中传递C字符串,因为版本字符串实际上是动态生成的,并且可能包含一些引号。这意味着仅仅编写g++ -D VERSION=\""$(GENERATED_STRING)"\"而不是对传递的参数进行字符串化是行不通的。

注意 2:如果有人找到一种完全没有任何预处理器宏的方法,我会非常高兴。