【发布时间】:2022-01-19 23:14:54
【问题描述】:
我是 C 的初学者,在编程过程中我发现了有关按位加法的代码
#define WORD_FROM_BUF(WRD) ((((unsigned char *)(WRD))[0]<<8)|((unsigned char *)(WRD))[1])
我已经尝试将这段代码修改为这种形式
#define WORD_FROM_BUF(WRD) (((unsigned char *)(WRD[0])<<8)|((unsigned char *)(WRD[1]))
编辑 我的问题类似于这两个问题 C macros and use of arguments in parentheses- by Palec
Can we remove parentheses around arguments in C macros definitions?- by Palec
谢谢大家的解释
【问题讨论】:
-
两个字:运算符优先级。
-
这能回答你的问题吗? C macros and use of arguments in parentheses
-
呃。 IMO 那是非常糟糕的代码。 Waaaay 太多的东西被塞进了那个宏——这就是为什么你很难弄清楚发生了什么。被一个在优化过程中内联的函数所取代真是令人尖叫......
-
您修改原始代码的目的是什么?源代码中符号的随机重新排列通常会导致不同的结果(通常是编译错误,但有时会以不同的方式运行有效程序)。
-
除了第二个例子有不平衡的括号外,第一个例子中的转换修改了
WRD(在索引结果之前),但在第二个例子中它们修改了WRD[0]和WRD[1](在索引结果之后)指针)。索引[1]的实际偏移量(以字节为单位)取决于指针的类型。
标签: c redefinition