是否有任何技巧禁止C宏被称为左值?

wsx*_*oys 7 c macros

例如,

struct node {
  struct node *left, *right;
};
#define LEFT(X) (X->left)
#define RIGHT(X) (X->right)
Run Code Online (Sandbox Code Playgroud)

我想在不改变现有宏接口的情况下禁止这样的宏调用.

LEFT(n) = ...
Run Code Online (Sandbox Code Playgroud)

任何的想法?

R..*_*R.. 8

试试这个:

#define LEFT(X) ((X)->left+0)
#define RIGHT(X) ((X)->right+0)
Run Code Online (Sandbox Code Playgroud)


Ale*_*tov 6

#undef LEFT
#undef RIGHT

//template<class T>
inline const node * const LEFT(const node * X) {
    return X->left;
}
Run Code Online (Sandbox Code Playgroud)

  • @wsxiaoys您还可以在C99中创建内联函数. (3认同)

APr*_*mer 5

我会使用内联函数,但如果你想要一个宏:

#define LEFT(X) (1 ? (X)->left : 0)
Run Code Online (Sandbox Code Playgroud)