gpt4 book ai didi

c++ - 使用 #define 指令作为代码的 "part",而不是在文件顶部

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:59 26 4
gpt4 key购买 nike

当查看 C++ 源代码时,我几乎总是在文件的头部看到 #define 宏,这在大多数情况下是有意义的,我明白为什么这是最佳实践,但我最近遇到一种情况,将预处理器定义保存在函数体中可能会更好。

我正在写一个 quaternion类,我的相关函数代码如下所示:

Quaternion Quaternion::operator*(const Quaternion& q){
Quaternion resultQ;

// These are just macros to make the code easier to read,
// 1 denotes the quaternion on the LHS of *,
// 2 denotes the quaternion of the RHS 0f *, e.a. Q1 * Q2.
// the letter denotes the value of the real number constant part
// for each seperate part of the quaterion, e.a. (a+bi+cj+dk)

#define a1 this->get_real()
#define a2 q.get_real()
#define b1 this->get_i()
#define b2 q.get_i()
#define c1 this->get_j()
#define c2 q.get_j()
#define d1 this->get_k()
#define d2 q.get_k()

// This arithemtic is based off the Hamilton product
// (http://en.wikipedia.org/wiki/Quaternion#Hamilton_product)
resultQ.set_real(a1*a2 - b1*b2 - c1*c2 - d1*d2);
resultQ.set_i(a1*b2 + b1*a2 + c1*d2 - d1*c2);
resultQ.set_j(a1*c2 - b1*d2 + c1*a2 + d1*b2);
resultQ.set_k(a1*d2 + b1*c2 - c1*b2 + d1*a2);
return resultQ;
}

我决定在 #define 中添加,因为如果我手动替换所有宏,每一行都会太长,并且在阅读时要么被截断要么转移到下一行。我本可以对变量做同样的事情,但我认为这是不必要的开销,所以我使用了 #define 因为它没有运行时开销。这是可以接受的做法吗?有没有更好的方法让我在这里做的事情可读?

最佳答案

代替

#define a1 this->get_real()

auto const a1 = get_real();

只需为每个变化的量值使用不同的名称即可。

是的,在某些情况下,本地 #define 是有意义的。不,这不是这种情况。特别是,由于您忘记了 #undef 宏,如果这是在 header 中(如指示的那样),它们几乎肯定会导致某些其他代码中的无意文本替换。


顺便说一句,而不是

Quaternion Quaternion::operator*(const Quaternion& q){

我会写

Quaternion Quaternion::operator*(const Quaternion& q) const {

这样 const 四元数也可以相乘。

关于c++ - 使用 #define 指令作为代码的 "part",而不是在文件顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22738009/

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