我正在尝试设计一个宏来生成与需要初始化的事物相关的几个相关数据结构.代码必须在C和C++下编译.目标是有类似的东西:
MUNGE_THING(struct1); MUNGE_THING(array1);
变成相当于的东西
munge_thing((void*)&struct1, sizeof(struct1)); munge_thing((void*)array1, sizeof(array1));
是否有任何语法的东西我可以围绕宏参数,以便它在处理地址和获取大小时都能正确处理数组和结构?最可能的上下文将在初始化列表的常量声明中.
如果这是不可能的,并且有必要为结构和数组使用单独的宏,那么确保错误传递错误的最佳语法将产生编译错误而不是伪造的代码?
在"旧"C中,在数组地址前添加"&"会产生警告,但不会阻止编译.在C++中,它似乎产生一个存储数组地址的位置的地址.
MUNGE_THING宏将位于另一个宏中,该宏将使用不同的MUNGE_THING定义多次调用,因此对阵列和结构使用单独的宏将是令人厌烦的.我能想到的最好的方法是给MUNGE_THING一个额外的"可选"&符号参数,但这看起来很丑陋.
如果数组实际上是一个数组(这似乎是sizeof工作所必需的),为什么不使用简单的宏:
#define MUNGE_THING( x ) munge_thing((void*)&(x), sizeof(x))
Run Code Online (Sandbox Code Playgroud)
这应该适用于数组和结构:
int array[10];
assert( (void*)array == (void*)&array );
Run Code Online (Sandbox Code Playgroud)
您已将问题标记为C和C++,在C++中,您可以使用模板并一起避免使用宏.