Linux:为啥内核有的变量没有初始化就敢直接使用?
一、问题
为啥内核有的变量没有初始化就敢直接使用?
二、分析
看上图,其中的5747行的变量nid的确没有定义,就直接使用了,这么做没有问题吗?
其实大家仔细看一下,5765行是一个宏,
到内核源码去找该宏的定义:linux-3.14includelinuxNodemask.h
#define for_each_online_node(node) for_each_node_state(node, N_ONLINE)
其中的for_each_node_state又是一个宏,继续跟踪该宏,有两处定义
408 #if MAX_NUMNODES > 1
……
429 #define for_each_node_state(__node, __state)
430 for_each_node_mask((__node), node_states[__state])
……
450 #else
……
470 #define for_each_node_state(node, __state)
471 for ( (node) = 0; (node) == 0; (node) = 1)
……
481 #endif
究竟是哪一个定义,由条件#if MAX_NUMNODES > 1 来决定,
#ifdef CONFIG_NODES_SHIFT
#define NODES_SHIFT CONFIG_NODES_SHIFT
#else
#define NODES_SHIFT 0
#endif
#define MAX_NUMNODES (1 << NODES_SHIFT)
因为CONFIG_NODES_SHIFT没有定义【可以检索一下内核,找不到该宏的定义】,所以NODES_SHIFT 为0
所以 MAX_NUMNODES 为1;
所以 for_each_node_state 定义如下:
470 #define for_each_node_state(node, __state)
471 for ( (node) = 0; (node) == 0; (node) = 1)
而此处的node 对应 粉丝截图的nid,__state 对应 N_ONLINE
所以5765行代码,可以展开为
for ( (nid) = 0; (nid) == 0; (nid) = 1)
可见,nid被定义了。
三、宏定义的注意点
宏定义是一个给定名称的代码片段,当我们使用这个名称的时候,预处理器会自动将其替换为宏定义的内容。宏定义有两种,一种是object-like宏定义,在使用的时候相当于一个数据对象;另一种是function-like,在使用的时候就像调用函数那样。
1. 只占用编译时间
宏展开会使源程序变长,但是宏展开发生在编译过程中,不占运行时间,只占编译时间。
宏展开因为在预处理阶段发生,不会分配内存。
2. 宏替换发生时机
编译c源程序的过程:
预处理编译汇编连接
宏替换发生在编译预处理阶段。
3. 预处理包括哪些工作
预处理产生编译器的输出,实现功能如下
1)文件包含
把#include中包含的内容拓展为文件的正文,即找到.h文件,同时展开到#include所在处
2)条件编译
根据#if和#ifdef等编译命令,将源程序文件中的部分包含进来,部分排除,排除在外的一般转换为空行

图片新闻
最新活动更多
-
7月22-29日立即报名>> 【线下论坛】第三届安富利汽车生态圈峰会
-
7.30-8.1火热报名中>> 全数会2025(第六届)机器人及智能工厂展
-
7月30-31日报名参会>>> 全数会2025中国激光产业高质量发展峰会
-
即日-2025.8.1立即下载>> 《2024智能制造产业高端化、智能化、绿色化发展蓝皮书》
-
即日-8.30免费下载>>> 福禄克在线温度监测应用案例手册
-
精彩回顾立即查看>> 【在线会议】英飞凌新一代智能照明方案赋能绿色建筑与工业互联
推荐专题
- 1 进击的汇川技术 | 东南亚篇
- 2 中控技术工业AI再获亿元订单,打造全球最大煤炭清洁转化智能工厂
- 3 宝信软件2025 年度行动方案,推进PLC核心技术和AI融合
- 4 重磅!科远智慧希望引入 “战投” 发力工业 AI,抢占千亿市场
- 5 数亿元 C + 轮融资落地!埃克斯加码半导体智能制造
- 6 安川电机 1.8 亿美元美国扩张计划,欲破局全球竞争?
- 7 现场直击 | 维科网WOD制造业数字化博览会(上海)巡展直播,领略全球制造业数字化转型的巅峰盛会!
- 8 硬核登场!凌科LP-12系列 90°工业级连接器上市,打造行业高可靠连接解决方案
- 9 一眼洞穿零部件内部缺陷,海康发布加持大模型的工业探伤系列产品
- 10 突发!工业自动化巨头西门子高管变动
发表评论
登录
手机
验证码
手机/邮箱/用户名
密码
立即登录即可访问所有OFweek服务
还不是会员?免费注册
忘记密码其他方式
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论