gpt4 book ai didi

C++ 编写一个适当的类似函数的宏

转载 作者:太空宇宙 更新时间:2023-11-04 14:34:51 25 4
gpt4 key购买 nike

我一直在努力编写一个适当的 #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< 的 xyz 成员的引用 通过使用 xyz 作为变量名(在赋值的左边)和标签来替换预处理器(在作业的右侧)。

(正如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com