gpt4 book ai didi

c++ - 在 C 或 C++ 中使用逗号作为宏名称

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

我想做这样的事情:

#define , 
#define MAX 10,000,000
// ...
#undef ,

这样做有什么技巧吗?

编辑:我知道 C++14 中的 ' 数字分隔符。我正在寻找对不兼容的编译器执行相同操作的技巧。
EDIT2:请考虑 Variadic Macros

最佳答案

警告,前方有黑魔法。

确实可以使用宏,尽管带有预设数量的参数。这个数字可以是任意的,但每个都必须手写:

#include <stdio.h>
#include <stdlib.h>

#define MERGE_EXPAND( a , b ) a##b
#define MERGE( a , b ) MERGE_EXPAND( a , b )

#define COUNT_PICK( a , b , c , pick , ... ) pick

#define COUNT( ... ) COUNT_PICK( __VA_ARGS__ , 3 , 2 , 1 , 0 )

#define JOIN_1( a ) a
#define JOIN_2( a , b ) a##b
#define JOIN_3( a , b , c ) a##b##c

#define JOIN( ... ) MERGE( JOIN_ , COUNT( __VA_ARGS__ ) )( __VA_ARGS__ )

int main( void )
{
printf( "%d\n" , JOIN( 12345 ) ) ;
printf( "%d\n" , JOIN( 100,44 ) ) ;
printf( "%d\n" , JOIN( -10,44,9999 ) ) ;

return EXIT_SUCCESS ;
}

宏 COUNT 计算传递给它的参数的数量。这是通过将参数传递给辅助宏 COUNT_PICK,并添加额外的参数来完成的,这些参数是倒序的连续数字。传递给 COUNT 的原始参数的数量然后操纵 COUNT_PICK 的参数,以便选择其中一个数字。

然后将所选数字与 JOIN 合并,生成 JOIN_1、JOIN_2 或 JOIN_3。然后将所选宏与原始参数一起使用,并将它们简单地合并为一个整数文字。

这个例子可以通过手动定义更多的 JOIN_X 宏来扩展,其中 X 是一个连续的数字。同时,宏 COUNT 和 COUNT_PICK 也必须更改。

作为额外的好处,传递无效参数,例如:

JOIN( 10,+44 );
JOIN( 10,-44 );
JOIN( 10,*44 );
JOIN( 10,/44 );
JOIN( /10,44 );
//etc...

将产生一个编译时警告,但仍然允许产生有效整数常量的参数。

要与 Microsoft 编译器一起使用,使用 SVC14(Microsoft Visual Studio 2015 Update 3)进行测试,必须修改代码。宏 COUNT_PICK 和 MERGE 必须用额外的扩展宏包装:

#define EXPAND(...)   __VA_ARGS__

关于c++ - 在 C 或 C++ 中使用逗号作为宏名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39775329/

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