我一直在努力编写一个适当的 #define
类函数宏,但我遇到了困难。这是我正在使用的示例:
#include <iostream>
#define pMAKE(x,y,z,dest)\
(dest).(x) = (x);\
(dest).(y) = (y);\
(dest).(z) = (z);
struct pt {
double x, y, z;
};
int main() {
pt p;
pMAKE(0,1,2,p);
return 0;
}
我得到的错误:
A.cpp: In function ‘int main()’:
A.cpp:13: error: expected unqualified-id before ‘(’ token
A.cpp:13: error: expected unqualified-id before ‘(’ token
A.cpp:13: error: expected unqualified-id before ‘(’ token
这些错误是什么意思,我为什么会收到这些错误?我设法让以下内容按照我想要的方式工作,但老实说我很幸运,我真的不明白发生了什么。
#define pMAKE(X,Y,Z,dest)\
dest.x = (X);\
dest.y = (Y);\
dest.z = (Z);
感谢您的每一点帮助!
最佳答案
使用宏的第一个版本,pMAKE(0,1,2,p);
扩展为
p.0 = 0;
p.1 = 1;
p.2 = 2;;
换句话说,您已经预处理掉了对 pt< 的
通过使用 x
、y
、z
成员的引用x
、y
、z
作为变量名(在赋值的左边)和标签来替换预处理器(在作业的右侧)。
(正如 Konrad Rudolph 所指出的)不幸的是,您的宏还有另一个严重的错误。考虑以下形式的代码
pt p;
if (foo)
pMAKE(0,1,2,p);
扩展为
pt p;
if (foo)
p.x = 0;
p.y = 1; // happens regardless of 'foo' test
p.z = 2;; // happens regardless of 'foo' test
您可以通过将宏更改为
来解决此问题(并摆脱烦人的额外分号)#define pMAKE(X,Y,Z,dest)\
do { \
(dest).x = (X);\
(dest).y = (Y);\
(dest).z = (Z);\
} while (0)
关于C++ 编写一个适当的类似函数的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14754703/