【发布时间】:2014-08-19 01:02:53
【问题描述】:
我正在尝试用 C(唉,不是 C++)编写一个宏,以捕获某些错误,特别是如果我传递了错误类型的名称。
例如,用
typedef int APLNELM;
typedef int APLRANK;
#define IsScalar(a) ((a) == 0)
APLNELM AplNelm = 0;
APLRANK AplRank = 0;
调用IsScalar (AplRank) 是正确的,因为Scalar 是一个等级概念,但IsScalar (AplNelm) 是错误的,因为Scalar 不是# 元素概念。
某个聪明的人能否找到一种方法来编写IsScalar 宏,以便它检查传递给它的名称的类型以确保它是APLRANK 类型?如果可以提供解决方案,请随意以任何等效方式重写原始示例。
【问题讨论】:
-
Typedef 声明不生成类型。
APLNELM和APLRANK是完全相同的类型,并且都与int完全相同。 -
IsScalar必须是宏吗?您可以创建结构来表示您的不同类型,并使IsScalar成为接受正确数据类型的实际函数。 -
您期待运行时测试还是编译错误?
-
我认为@Ranic 是一个非常合适的解决方案。如果您仍然关心类型大小,您可以从结构中删除额外的填充,并使其与
sizeof(int)完全匹配。 -
可能重复:stackoverflow.com/questions/376452/…。请看一看;那里有很多很好的答案!