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

标签 c++ directive

我一直在努力编写一个适当的 #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/

相关文章:

c++ - Unresolved external 错误

c++ - 这段代码中 "and N"有什么用?

android - 如何从 ARCore NDK 中的 ArCamera Pose 获取 Matrix4x4?

angularjs - Angular 动态多态指令

javascript - AngularJS - 为什么在指令中使用匿名 Controller ?

php - 我需要一个很好的工具来设计我的代码——即间距、括号等

c++ - 比较 boost::system::error_category

Angular 指令选择器不适用于外部库中的元素

javascript - 隔离范围 View 绑定(bind)

javascript - 将类添加到 AngularJs 中的多个元素