【发布时间】:2010-08-06 23:30:39
【问题描述】:
我正在尝试设计一个宏来生成与需要初始化的事物相关的几个相关数据结构。代码必须在 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 一个额外的参数来表示“可选”&符号,但这似乎很难看。
【问题讨论】:
-
如果C和C++需要不同的定义,你可以使用#ifdef __cplusplus