问题标签 [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.
macros - 预处理器引用宏参数
假设我有一些宏#define NAME name
,并且我想定义一些其他宏,它将扩展为引用的值。也就是说,好像我也定义了#define NAME_STR "name"
. 有没有比以下更简洁的方法?
c - gcc 的预处理器如何评估哈希值?
stdint.h(来自newlib)中这个块的目的是什么?
这个宏稍后在标题中用于整数比较,但我不确定它应该如何评估。例如:
c++ - 有没有办法在可变参数宏参数上使用 C++ 预处理器字符串化?
我的猜测是这个问题的答案是否定的,但如果有办法,那就太棒了。为了澄清,假设我有以下宏:
我想做的是在将 X 的所有变量传递给可变参数函数之前以某种方式对其进行字符串化;这里的关键字是之前。我意识到没有办法真正从宏定义中访问各个参数,但是有没有办法将所有参数字符串化,可能类似于以下内容?
c++ - 预处理器tomfoolery(字符串化#include)
注意:这个问题与 OpenCL 本身无关......检查最后一段以获得我的问题的简洁陈述。但要提供一些背景:
我正在编写一些使用 OpenCL 的 C++ 代码。我喜欢将我的 OpenCL 内核的源代码保存在它们自己的文件中,以简化编码和维护(而不是将源代码直接作为字符串常量嵌入到相关的 C++ 代码中)。这不可避免地会导致在分发二进制文件时如何将它们加载到 OpenCL 运行时的问题——理想情况下,OpenCL 源代码包含在二进制文件中,因此二进制文件不需要位于特定位置在某个目录结构中知道 OpenCL 源代码在哪里。
我想将 OpenCL 文件作为字符串常量包含在某处,并且最好不使用额外的构建步骤或外部工具(为了交叉编译器/跨平台的易用性......即,禁止xxd
等)。我以为我偶然发现了一种基于此线程中第二个答案的技术,如下所示:
请注意,如果可能的话,我宁愿不将STRINGIFY
宏嵌入到我的 OpenCL 代码中(正如上面引用的 SO 问题中所做的那样)。现在,这在 Clang/LLVM 编译器上运行得非常好,但是 GCC 死得很惨(“未终止的参数列表调用宏 STRINGIFY”和与 .cl 文件内容相关的各种语法“错误”出现)。所以,很明显,这种精确的技术不能在编译器中使用(没有尝试过 MSVC,但我也希望它在那里工作)......我怎样才能最小化地按摩它以便它在编译器中工作?
总之,我想要一种符合标准的技术,用于将文件的内容作为 C/C++ 字符串常量包含在内,而无需调用外部工具或使用无关代码污染文件。想法?
编辑:正如 Potatoswatter 指出的那样,上述行为是未定义的,因此不涉及接触要字符串化的文件的真正交叉编译器预处理器技术可能是不可能的(第一个找出令人发指的人对大多数/所有编译器都有效的 hack 得到了答案)。出于好奇,我最终执行了此处第二个响应中的建议……也就是说,我将STRINGIFY
宏直接添加到了我包含的 OpenCL 文件中:
在somefile.cl
:
在somefile.cpp
:
这适用于我尝试过的编译器(Clang 和 GCC,因为它在宏中没有预处理器指令),并且至少在我的上下文中不是太大的负担(即,它没有t 干扰语法高亮/编辑 OpenCL 文件)。像这样的预处理器方法的一个特点是,由于相邻的字符串被连接起来,你可以写
并且只要 STRINGIFY 宏在两个.cl
文件中,字符串就会连接起来,允许您模块化 OpenCL 代码。
arrays - Array.toString() 是否保证在 ActionScript 3 中保持不变?
是否可以向Array.toString()
用户显示输出,或者字符串格式是否有可能在 ActionScript 3 或其他编译器的未来版本中发生变化?
c++ - 如何使用 cpp 将宏转换为字符串?
GNU 的 cpp 允许您像这样将宏参数转换为字符串
然后,STR(hi)
被替换为"hi"
但是如何将宏(不是宏参数)转换为字符串?
假设我有一个具有某些值的宏 CONSTANT,例如
这不起作用:STR(CONSTANT)
. 这产生"CONSTANT"
了我们不想要的结果。
c - C预处理器“字符串化”的对面
当使用 C 预处理器时,可以像这样对宏参数进行字符串化:
所以使用时,结果如下:
TO_STRING(test)
将扩展为:"a string with test"
有什么相反的方法吗?获取字符串文字作为输入参数并生成 C 标识符?例如:
TO_IDENTIFIER("some_identifier")
将扩展为:some_identifier
谢谢您的回答。
编辑:对于那些想知道我需要它做什么的人:
我想通过字符串标识符来引用我的 3D 引擎的场景图中的节点,但同时避免在紧密循环中比较字符串。所以我想我会写一个简单的工具,它将在编译的预构建步骤中运行并搜索预定义的字符串——例如ID("something")
. 然后对于每个这样的标记,它会计算括号之间的字符串的 CRC32 并生成一个带有包含这些数字标识符的#defines 的头文件。例如对于字符串"something"
,它将是:
#define __CRC32ID_something 0x09DA31FB
然后,每个 cpp 文件将使用ID(x)
宏包含生成的头文件。ID("something")
当然会扩展为,因此__CRC32ID_something
实际上编译器会看到简单的整数标识符而不是人类友好的字符串。当然现在我会简单地接受,ID(something)
但我认为使用引号会更有意义 - 不知道ID
宏如何工作的程序员可以认为something
没有引号是 C 标识符,而实际上这样的标识符不存在全部。
c - 如何在连接之前引起宏扩展?
这扩展为:
如何得到:
?
visual-c++ - C++ 预处理器中的奇怪定义
我遇到过这个
一切都很清楚,除了“c##_”这个词,这是什么意思?
c - C预处理器字符串化怪异
我正在定义一个宏,它评估为一个常量字符串,保存文件名和行号,用于记录目的。
它工作得很好,但我只是无法弄清楚为什么需要 2 个额外的宏 -STRINGIFY
并且TOSTRING
,当直觉简单地建议时__FILE__ ":" #__LINE__
。
这对我来说似乎是一个丑陋的黑客。
有人可以详细解释逐步发生的事情,以便__LINE__
正确地进行字符串化,以及为什么两者都__FILE__ ":" STRINGIFY(__LINE__)
不起作用__FILE__ ":" #__LINE__
?