有什么技巧可以禁止将C宏称为左值吗?
|
例如,
struct node {
struct node *left, *right;
};
#define LEFT(X) (X->left)
#define RIGHT(X) (X->right)
我想禁止这样的宏调用而不更改现有的宏接口。
LEFT(n) = ...
任何的想法?
没有找到相关结果
已邀请:
9 个回复
炉挤仙挟
田损比报
莽缓逢
刷骸码
门锑腺潮
那个特定运算符的语义存在技巧。仅包含运算符的表达式类型是该表达式的两个分支的通用类型(或可从其转换的类型),即使只评估了其中一个。现在,当编译器求值
时,它将解析为表达式
,但其通用类型为
和
。它们基本上是同一类型,唯一的细节是that9是右值,而不是左值。
仇聘发栖
,尽管它需要显式类型:
...虽然具有
编译器扩展名:
bab
对于一般的宏情况,这与添加ѭ16相比具有优势,它也适用于
和函数指针。对于C,您可以使用逗号运算符
痴浪墨
这种强制转换的结果始终是右值。此外,如果您不想更改指针所指向的内容,以添加
,正如在另一个答案中已经给出的那样:
寇剩
然后,您可以像访问其他变量一样访问LEFT宏。这使代码更具可读性,同时有效地禁用了与类函数宏关联的整个不安全,难看,易出错,行为不确定的芭蕾舞。