gpt4 book ai didi

c++ - 为什么不能将 C++11 大括号初始化与宏一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:00 25 4
gpt4 key购买 nike

我刚刚发现在将参数传递给宏时不能总是使用大括号初始化。我在 ASSERT() 宏编译失败时发现了这一点。然而,下面的例子说明了这个问题:

#include <iostream>
#include <string>
using namespace std;

#define PRINT_SIZE( f ) cout << "Size=" << (f).size() << endl;

int main()
{
PRINT_SIZE( string("ABC") ); // OK, prints: "Size=3"
PRINT_SIZE( string{"ABC"} ); // OK, prints: "Size=3"

PRINT_SIZE( string("ABCDEF",3) ); // OK, prints: "Size=3"
PRINT_SIZE( string{"ABCDEF",3} ); // Error: macro 'PRINT_SIZE' passed 2 arguments, but takes just 1

return 0;
}

有没有理由不能使宏与大括号初始化一起工作?

编辑:

从那以后我发现你也可以使用可变参数宏,这完美地解决了这个问题:

#include <iostream>
#include <string>
using namespace std;

#define PRINT_SIZE( ... ) cout << "Size=" << (__VA_ARGS__).size() << endl;

int main()
{
PRINT_SIZE( string("ABC") ); // OK, prints: "Size=3"
PRINT_SIZE( string{"ABC"} ); // OK, prints: "Size=3"

PRINT_SIZE( string("ABCDEF",3) ); // OK, prints: "Size=3"
PRINT_SIZE( string{"ABCDEF",3} ); // OK, prints: "Size=3"

return 0;
}

最佳答案

列表被分成几个宏参数。当你写作时

PRINT_SIZE( string{"ABCDEF",3} );

这试图用两个参数扩展宏 PRINT_SIZE,一个 string{"ABCDEF" 和一个 3},但失败了。在许多情况下(包括你的)这可以通过添加另一对括号来解决:

PRINT_SIZE( (string{"ABCDEF",3}) );

这些括号防止了参数的拆分,因此 PRINT_SIZE 被扩展为单个参数 (string{"ABCDEF",3})(注意括号是论点的一部分)。

关于c++ - 为什么不能将 C++11 大括号初始化与宏一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29578902/

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