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

时间:2016-09-29 16:16:45

标签: c++ c c-preprocessor

我想做点什么:

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

有没有诀窍呢?

编辑:我知道C ++ 14中的'数字分隔符。我正在寻找一种技巧来为不合规的编译器做同样的事情 编辑2:请考虑Variadic Macros

6 个答案:

答案 0 :(得分:6)

警告,黑魔法。

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

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

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

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

#define EXPAND(...)   __VA_ARGS__

答案 1 :(得分:5)

  

有没有诀窍呢?

不,你不能。宏有一组特定的字符可用于命名它们(请参阅详细信息here)。 ,不是其中之一。

答案 2 :(得分:4)

购买最新的符合C ++ 14标准的编译器。这允许您使用'作为千位分隔符:

#define MAX 10'000'000

虽然在这样的品牌中使用宏来打击新的C ++编译器是不合时宜的。

10,000,000不会很好。如果在表达式中使用,那么,将代表逗号运算符。

所以int a = (10,000,000)为零。它可能比这更糟糕:前导零表示八进制文字,因此int a = (10,000,010)实际上是8。

答案 3 :(得分:2)

虽然它有点单调乏味且不优雅,但是很好看:

"\d+?\.\d+?","Form1","your-email","([^\r\n])*","1",NULL\r?\n"\d+?\.\d+?","Form1","your-subject","([^\r\n])*","2",NULL)

答案 4 :(得分:1)

您始终可以使用将解析字符串文字的自定义函数:

int value = Number( "100,000,000" );

缩减是解析的一些小开销,其好处是错误检查,以及使用任何所需格式的能力。

可以通过在大多数范围内重用const varible来最小化解析本身。

答案 5 :(得分:1)

提高代码清晰度的一个技巧是将宏定义为:

#define MAX    (10 * 1000 * 1000)

基本原理是现代编译器足够聪明,可以将表达式简化为单个整数常量10000000。这被称为constant propagation(或常数折叠)。