C语言中如何将宏定义常量名转换为其对应的整数值
问题根源
C/C++ 的宏属于预处理阶段的语法,编译过程中预处理器会直接把所有宏名替换成对应的数值,最终生成的二进制程序里不存在任何宏名称和数值的绑定关系。你运行时拼接出来的"IDC_FORCE%d"只是普通字符串,和你定义的宏没有任何关联,强制把字符数组指针转int拿到的只能是字符串的内存地址,自然无法得到正确的控件ID。
可行解决方案
方案1:建立ID映射数组(最稳妥,符合你的需求)
提前把同系列的控件ID按顺序存入数组,后续直接通过索引取值即可,即使后续删除了某个控件,只要同步删除数组中对应的元素,就不会出现调用无效ID的问题:
// 提前定义同系列ID的映射数组,顺序和你要使用的索引对应 const int force_id_list[] = {IDC_FORCE1, IDC_FORCE2, IDC_FORCE3, IDC_FORCE4, IDC_FORCE5}; const int state_id_list[] = {IDC_STATE1, IDC_STATE2, IDC_STATE3, IDC_STATE4, IDC_STATE5}; // 使用时直接通过索引取ID,philNum从0开始计数 SetDlgItemText(hWnd, force_id_list[philNum], force); SetDlgItemText(hWnd, state_id_list[philNum], state);
方案2:计算式宏定义(仅适合同系列ID连续的场景)
如果你的同系列控件ID本身就是按顺序连续定义的,没有中间断号,可以直接定义计算式宏直接生成ID:
// 要求IDC_FORCE1 ~ IDC_FORCEn 数值连续递增 #define IDC_FORCE(n) (IDC_FORCE1 + (n) - 1) #define IDC_STATE(n) (IDC_STATE1 + (n) - 1) // 使用时直接传入序号即可 SetDlgItemText(hWnd, IDC_FORCE(philNum + 1), force); SetDlgItemText(hWnd, IDC_STATE(philNum + 1), state);
这个方案的缺点是如果后续删除了中间某个控件导致ID断号,就会拿到无效ID,适合ID不会轻易变动的场景。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

