gpt4 book ai didi

c++ - 为什么可变参数宏如此令人不快?

转载 作者:行者123 更新时间:2023-11-30 19:54:21 25 4
gpt4 key购买 nike

与 C++ 的可变参数模板相比,CPP(C/C++ 预处理器;为了简单起见,在这个问题中我将其视为单一的、独立的语言)中的可变参数宏极其受到限制。本质上,可变参数宏只是带有参数的宏,其参数允许包含逗号。这没有提供直接的方法来计算参数、对参数进行一一操作等。这些事情可能,但需要复杂、令人困惑且编译缓慢的 hack,例如 this question 中描述的那些。使用 VA_ARGS 唯一可以直接做的事情就是将它们传递给可变参数函数。

我的问题是,为什么要这样设计?在任何纯函数语言(如 CPP)中,列表的标准方法都是 cons 风格的模式匹配:处理列表的第一个参数并递归其余参数,并为空列表提供基本情况。标准委员会成员对这种方法非常熟悉。

为什么 CPP 的可变参数宏没有采用这样的方法?可变参数宏是否被视为简单地包装可变参数函数的一种方式,这样就不需要对参数列表进行操作?是否存在一些根本问题使得允许可变参数宏递归变得不切实际?或者...?

注意:我不是在寻找“因为人们不应该想要可变参数宏”形式的答案/评论。像 boost.preprocessor 这样的东西的存在表明,理性的人希望以不平凡的方式使用预处理器。也不寻求关于为什么其他设计是好/坏主意的个人意见。我正在尝试找出当时的实际原因。

最佳答案

可变宏从 C 继承到 C++。

Clive Feather撰写了向 C 添加可变宏的论文。

The paper, N580: Varargs for Function-like Macros状态:

This proposal allows the author of a macro to state that it takes a variable number of arguments, and to substitute the trailing arguments en bloc.

[...]

It would be possible to provide further facilities, but this has been left for further proposals.

One issue is whether it should be possible to allow zero actual arguments to match the trailing parameter. It has been decided not to allow this, as this fits better with another proposal being made separately.

因此计划是添加最需要的功能(可用于填充 printf 调用的宏),并为以后的论文留下进一步的扩展。

在 C++ 中,宏是二等公民。 C++ 很少用新的宏语法或功能进行创新,而是想办法在没有宏的情况下解决问题。

C 还没有进一步创新。

添加到 C 中的实际可变参数宏来自于该论文的论文,但该论文在这一决定背后有最清晰的动机文本。

关于c++ - 为什么可变参数宏如此令人不快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55004354/

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