gpt4 book ai didi

c - 使用预处理器的 C 中的运算符重载语法

转载 作者:行者123 更新时间:2023-12-02 00:17:06 25 4
gpt4 key购买 nike

在包含大量 vector 计算的代码中使用以下预处理器技巧是否是一个好习惯?一方面,它使用通用标识符(mul、add、...)污染了 namespace ,并且闻起来像一个肮脏的 hack,但另一方面,它可能使复杂的表达式更具可读性。还有其他优点/缺点吗?

typedef struct { double x,y; } vector;
vector vector_add(vector v0, vector v1);
double vector_mul(vector v0, vector v1);
...
#define _(a) opf(a)
#define mul ,mul,
#define add ,add,
...
#define opf(a,o,b) vector_##o((a),(b))

void example(void)
{
vector a, b, c;
double d;

d = _( _(a add b) mul c);

// equivalent without the macros:
d = vector_mul(vector_add(a,b),c);
}

最佳答案

不,这不是一个好主意(当然在我看来)。

假设我相当了解 C 语言,如果我看到这样一行代码:

d = vector_mul(vector_add(a,b),c);

我很清楚它的作用。我需要查看 abcd 的类型,以及函数,可以肯定,但即使没有函数,我也可以放心地假设它正在执行 vector 加法和 vector 乘法。

另一方面,如果我看到:

d = _( _(a add b) mul c);

在我首先找到宏定义之前,我可能不知道它在做什么,然后要么研究它们直到我理解你的新语法,要么自己将它们扩展为我能理解的普通 C 代码。当然,知道您的语法是什么意思,如果您是唯一阅读代码的人,那很好,但其他任何人都会想知道下划线是什么意思。

这是假设我知道您正在使用宏。宏名称通常全部大写。使用 ADDMUL 会有所改进,但恕我直言,这不足以克服其他缺点。

个人轶事:很多年前,当我第一次学习 C 时,我认为:

#define EVER ;;

...

for (EVER) {
/* ... */
}

非常聪明。我仍然认为它很聪明;我只是不再认为这是个好主意。

关于c - 使用预处理器的 C 中的运算符重载语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629874/

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