结构的指针经常被使用,因此有一个特殊的操作符: - >。以下表达式是等效的:
(*x).y
x->y
将此运算符简单地视为预定义宏定义如此公平是否合理:
#define (x)-> (*(x).)
为什么或为什么不呢?或者它从一开始就被编码为运营商 - 这将如何不同/有利?
好奇。
答案 0 :(得分:4)
以下表达式是等效的:?
(*x).y
x->y
是,两者都是访问结构成员y
的两种不同方式。
(*x).y
运算符是.
DOT,它与值变量Element selection by reference
一起使用。 *
使用的原因。意味着x
是指向struct的指针。
x->y
运算符->
名为Element selection through pointer
。这与指向struct的指针一起工作。这就是*
这次不使用的原因。
两者都相同。
将此运算符简单地视为预定义宏定义是否公平:
#define (x)-> (*(x).)
否首先它提供错误: 宏名称必须是标识符。此错误是因为我们不能将->
运算符作为宏名称。
valid macro name可以是:
宏名称应仅包含字母数字字符和下划线,即“a-z”,“A-Z”,“0-9”和“_”,并且第一个字符不应为数字。一些预处理器也允许美元符号字符'$',但你不应该使用它;不幸的是我不能引用C标准,因为我没有它的副本。
另外,注意->
和.
是差异运算符,如上所述。它们的优先级也不同,所以用一个操作符替换其他操作符是个坏主意。
访问struct元素的有效宏:
另外我想今天分享只有我才知道大多数C头文件。定义的宏如:
#define S(x) ((x).y)
用于特定的strcut元素。
注意(x)
周围的x
括号是覆盖*
优先于.
的优先级。默认情况下.
DOT优先于*
因此它可用于指针和简单变量。我想,下面我的例子会有所帮助。
#define S(x) ((x).y)
typedef struct {
int y;
}X;
X *x;
X b;
int main(){
S(*x);
S(b);
}
修改强>
更好的选择
我正在扩展我的想法以访问strcut元素,我定义了新的宏:
#define S(x,y) ((x).y)
typedef struct {
int a;
}X;
X *x;
X b;
int main(){
S(*x,a);
S(b,a);
}
对于通过宏的特定元素而言,不是更多。
希望至少OP喜欢它:)
答案 1 :(得分:4)
将此运算符简单地视为预定义宏定义如此公平是否合理:
没有
为什么或为什么不呢?
->
运算符具有一些不能用宏强制执行的特定语义(这是一个简单的文本替换)。也就是说,左侧操作数必须是指向struct或union类型的指针,右侧操作数必须是struct或union类型的成员,并且表达式的结果必须是一个左值。您无法使用宏强制执行这些规则。
答案 2 :(得分:1)
将此运算符简单地视为预定义宏定义如此公平是否合理:
不,它不会。
为什么或为什么不呢?
因为它不是宏。它是一种在语言中定义的独特运算符,似乎为另一种功能提供了语法糖。