linux系统中的“ __stringify() ”宏定义 详解

本文详细解析了Linux内核中的stringify宏如何实现间接字符串化,并通过实际应用案例展示了其在宏定义中的作用,即如何将变量转换为字符串形式,而不只是变量名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 include/linux/stringify.h :

 

#ifndef __LINUX_STRINGIFY_H
#define __LINUX_STRINGIFY_H

/* Indirect stringification.  Doing two levels allows the parameter to be a
 * macro itself.  For example, compile with -DFOO=bar, __stringify(FOO)
 * converts to "bar".
 */

#define __stringify_1(x...) #x
#define __stringify(x...)   __stringify_1(x)

#endif  /* !__LINUX_STRINGIFY_H */


看上述源代码,

__stringify(x...) 这个宏的实际展开为: #x 

其作用实际上就是 把  x 直接转换为字符串。其返回值就是字符串,而不是变量名。

 

   #define __ATTR(_name,_mode,_show,_store) { /
     .attr = {.name = __stringify(_name), .mode = _mode }, /
     .show = _show,     /
     .store = _store,     /
    }


 

假设我们这样使用  __ATTR:   

                       __ATTR(var_name, 777,  show_function, store_function)

  那么,实际上 复制给  .attr.name 的值是 "var_name" ,而不是var_name 变量所代表的值。

### JavaScript `__stringify` 方法使用说明 #### JSON 序列化基础 在 JavaScript 中,通常使用的不是 `__stringify` 而是 `JSON.stringify()` 来将对象或数组转换成 JSON 字符串。此方法可以接受三个参数:要序列化的对象、replacer 函数(用于过滤键/值),以及 space 参数(用于控制缩进和空白字符)。[^3] ```javascript const obj = { name: "Alice", age: 25, hobbies: ["reading", "coding"] }; // 将对象转为 JSON 字符串 const jsonString = JSON.stringify(obj); console.log(jsonString); // 输出 {"name":"Alice","age":25,"hobbies":["reading","coding"]} ``` #### 处理复杂数据结构 当遇到循环引用或其他复杂的嵌套结构时,`JSON.stringify()` 可能会抛出错误。为了处理这种情况,可以通过自定义 replacer 函数来排除特定字段。 ```javascript let person = {}; person.self = person; try { let result = JSON.stringify(person); } catch (e) { console.error(e.message); // 抛出异常:"Converting circular structure to JSON" } // 自定义 replacer 排除 self 属性 function customReplacer(key, value) { if (key === 'self') return undefined; return value; } console.log(JSON.stringify(person, customReplacer)); // 不再报错 ``` #### 设置格式化输出 对于调试目的来说,有时希望得到更易读的 JSON 表达形式。这时可以在第三个参数传递一个数值作为缩进级别,或者提供字符串作为前缀。 ```javascript const formattedJson = JSON.stringify({ title: "Example Book", author: "John Doe", chapters: [ { chapter: 1, content: "Chapter one..." }, { chapter: 2, content: "Chapter two..." } ] }, null, 4); console.log(formattedJson); /* 输出如下: { "title": "Example Book", "author": "John Doe", "chapters": [ { "chapter": 1, "content": "Chapter one..." }, { "chapter": 2, "content": "Chapter two..." } ] }*/ ``` #### 常见问题解答 - **如何忽略某些属性?** 使用 replacer 函数,在其中判断哪些键应该被跳过不参与最终的结果构建。 - **怎样解决循环引用的问题?** 实现自己的 replacer 或者利用第三方库如 lodash 的 cloneDeepWith 方法来进行深拷贝后再做序列化操作。 - **能否直接序列化 DOM 元素或者其他特殊类型的实例?** 默认情况下不行,因为这些实体包含了无法简单表示的信息。不过可以根据需求提取必要的部分手动构造一个新的纯 JS 对象去代替它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值