Ahm*_*shi 4 c c++ c-preprocessor
我想做点什么:
#define ,
#define MAX 10,000,000
// ...
#undef ,
Run Code Online (Sandbox Code Playgroud)
这有什么诀窍吗?
编辑:我知道'C++ 14中的数字分隔符.我正在寻找一个技巧来为不合规的编译器做同样的事情.
编辑2:请考虑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 ;
}
Run Code Online (Sandbox Code Playgroud)
宏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...
Run Code Online (Sandbox Code Playgroud)
将产生编译时警告,但仍允许导致有效整数常量的参数.
要与使用SVC14(Microsoft Visual Studio 2015 Update 3)测试的Microsoft编译器一起使用,必须修改代码.必须使用其他扩展宏包装宏COUNT_PICK和MERGE:
#define EXPAND(...) __VA_ARGS__
Run Code Online (Sandbox Code Playgroud)
小智 5
去购买最新的 C++14 兼容编译器。这允许您'用作千位分隔符:
#define MAX 10'000'000
尽管在这样一个全新的 C++ 编译器中使用宏是不合时宜的。
写作10,000,000不会有好的结局。如果在表达式中使用,,则将代表逗号运算符。
所以int a = (10,000,000)会为零。可能比这更糟糕:前导零表示八进制文字,因此int a = (10,000,010)实际上是 8。
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |