在C或C中使用逗号作为宏名称
我想做点什么:
#define,#define MAX 10,000,000 // ... #undef, 这有什么诀窍吗? 编辑:我知道C14中的’数字分隔符.我正在寻找一个技巧来为不合规的编译器做同样的事情. 解决方法
警告,黑魔法前方.
确实可以使用宏,尽管具有预设数量的参数.这个数字可以是任意的,但每个都必须手写: #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,c ) a##b##c #define JOIN( ... ) MERGE( JOIN_,COUNT( __VA_ARGS__ ) )( __VA_ARGS__ ) int main( void ) { printf( "%dn",JOIN( 12345 ) ) ; printf( "%dn",JOIN( 100,44 ) ) ; printf( "%dn",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__ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |