gpt4 book ai didi

c++ - 从带括号的模板参数列表到 "steal"逗号的类似函数的宏是否合法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:42 24 4
gpt4 key购买 nike

令我惊讶的是,为类似函数的宏提供带有两个模板参数的类型会导致编译器报错。

这个(概念上相似的)示例代码:

template<typename T>    struct foo{};
template<typename T, U> struct bar{};
#define p(x) printf("sizeof(" #x ") = %u\n", sizeof(x));

int main()
{
p(foo<int>); // works, of course
p(bar<int,int>); // does not work
p((bar<int,int>)); // does not work either
return 0;
}

使 GCC (6.2.0) 提示 宏“p”传递了 2 个参数,但只需要 1 个

嗯,当然,预处理器是一个预处理器做文本替换,它不是真正的 C++ 编译器,它理解模板或语言的所有其他规则。

也许我期望预处理器识别尖括号,当然,我问得太多了……但至少在规范中明确提到了括号。

16.3(第 10 至 12 段)规定了最外层的括号,这些括号界定了有界的标记序列。 “最外层” 一词表明可能还有预处理器识别的其他(非最外层)括号。
此外,它还明确指出“跳过中间匹配的左右括号对”以及“匹配内括号之间的逗号预处理标记不要分隔参数”——这意味着如果我阅读正确,那么至少最后一行应该在我的理解中通过。

我哪里理解错了?

最佳答案

p((bar<int,int>))是对 p 的有效调用带有单个宏参数的宏,即 (bar<int,int>) .到目前为止,您的理解是正确的。

不幸的是,它的扩展包括sizeof((bar<int,int>)) , 和 sizeof不接受双括号类型。

可变参数宏 (C++11) 作为替代方案在这里工作得很好。

#define p(...) printf("sizeof(" #__VA_ARGS__ ") = %u\n", sizeof(__VA_ARGS__));

关于c++ - 从带括号的模板参数列表到 "steal"逗号的类似函数的宏是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40512639/

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