gpt4 book ai didi

c - 只计算一次宏参数

转载 作者:太空狗 更新时间:2023-10-29 15:01:26 26 4
gpt4 key购买 nike

在下面的代码中,任何作为 retval 传递的内容都会被评估为每次使用该 token 时给定的。

#define _CPFS_RETURN(commit, retval) do { \
util_cpfs_exit(commit); \
return retval; \
} while (false)

#define CPFS_RETURN_BOOL(retval) do { \
_CPFS_RETURN(retval, retval); \
} while (false)

例如给定使用 CPFS_RETURN_BOOL(inode && file_truncate(inode, len));,这是生成的:

do { 
do {
util_cpfs_exit(inode && file_truncate(inode, len));
return inode && file_truncate(inode, len);
} while (0);
} while (0);

显然我不想多次执行语句 inode && file_truncate(inode, len);。我如何确保在乱七八糟地粘贴之前评估给定的标记?

更新

我相信我有充分的理由在这里使用宏。在可能的情况下,代码被放入实际函数(例如 util_cpfs_exit)中,这些函数从我正在使用的一组宏中调用。宏根据返回类型而有所不同:在 C++ 中,我有明确的模板来处理这个。

最佳答案

由于您的宏在返回类型上有所不同,您可以评估 retval 表达式并将其存储在第一级宏内正确类型的变量中,然后使用该变量。即:

#define CPFS_RETURN_BOOL(retval) do { \
bool _tmp_ = retval;
_CPFS_RETURN(_tmp_, _tmp_); \
} while (false);

如果我理解得很好,这对于您的用例应该足够了,对于其他用例,您可以使用函数。

在你的例子中你会得到:

do {
bool _tmp_ = inode && file_truncate(inode, len);
do {
util_cpfs_exit(_tmp_);
return _tmp_;
} while (0);
} while (0);

看起来不错。

PS:作为旁注,如果您总是按照上述模型通过另一个宏间接使用 _CPFS_RETURN,则无需通过 do { } while (false); 来保护它。此外,在 while(false) 之后放置一个分号会消除使用它的大部分兴趣……这可能是一个很好的例子,说明为什么 C 宏是危险的并且隐藏了容易犯的错误。并不是我不喜欢宏,恰恰相反。我来自(可能很少)那种希望增强 C 宏以绕过它们当前的限制以变得非常酷的人(不,C++ 模板不是增强的宏,它们是完全不同的东西)。

关于c - 只计算一次宏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605005/

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