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

标签 c++ c c-preprocessor

我想做这样的事情:

#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/

相关文章:

c++ - C++中指针类型转换的解释

c++ - 为什么 unique_ptr operator* 不是 noexcept?

c - 在 while 循环中重置值

c - 为什么setjmp/longjmp

c - ESP8266_NONOS_SDK FOTA配置

c++ - 使类不可复制的宏

c - 如何在宏中为声明变量实现 ifdef?

c++ - 使用棋盘标定的相机标定

c++ - 调用 glDrawArrays 时出现访问冲突错误

c - 如何使用 gcc 的 -I 命令添加递归文件夹