自定义C数组宏不符合预期:array_name未声明错误求助
C语言自定义数组宏编译报错的原因及解决方法
问题描述
我想在C语言中实现类似C++ std::array的自定义数组,但以下代码无法正常运行。
array.h 代码
#ifndef CUSTOM_ARRAY #define CUSTOM_ARRAY #define array(T, name, n_elements) do { \ T name [(n_elements)]; \ } while(0) #endif
main.c 代码
#include "array.h" #include <stdio.h> int main() { array(int, array_name, 5); size_t size_of_array = sizeof(array_name) / sizeof(array_name[0]); for (int i = 0; i < size_of_array; i++) { array_name[i] = i; printf("%d\n", array_name[i]); } return 0; }
编译错误信息
main.c: In function 'main': main.c:10:35: error: 'array_name' undeclared (first use in this function) 10 | size_t size_of_array = sizeof(array_name) / sizeof(array_name[0]); | ^~~~~~~~~~ main.c:10:35: note: each undeclared identifier is reported only once for each function it appears in
我原本以为main.c中的宏会展开为:
int array_name[5];
想知道为何会出现该错误?
原因分析与解决方法
问题出在你用do { ... } while(0)包裹了数组定义。这个结构会生成一个局部代码块,数组array_name的作用域仅限于这个代码块内部。当do-while执行完毕后,该数组就会超出作用域,后续代码自然无法访问,从而触发“未声明”的错误。
你误解了宏展开后的代码,真实展开后的代码是:
do { int array_name[5]; } while(0);
要解决这个问题,直接移除do-while包裹,将宏修改为:
#define array(T, name, n_elements) T name[(n_elements)]
修改后宏展开就是当前作用域内的数组定义,后续代码就能正常访问array_name了。
如果想让这个自定义数组更贴近std::array的特性,还可以添加获取数组长度的辅助宏:
#define array(T, name, n_elements) T name[(n_elements)] #define array_size(name) (sizeof(name)/sizeof(name[0]))
之后在main函数中就可以用array_size(array_name)来直接获取数组长度,使用起来更便捷。
内容的提问来源于stack exchange,提问作者user20598969
相关产品推荐
相关产品推荐

