gpt4 book ai didi

c - 根据参数值展开宏

转载 作者:太空狗 更新时间:2023-10-29 16:41:25 24 4
gpt4 key购买 nike

我有一个看起来像这样的宏:

M(id,...)

我希望它在 id == 0 和其他情况下展开为空。

这可能吗?如果是这样,怎么做?

我的第一直觉是尝试这样的事情:

#define M(id,...) M##id(__VA_ARGS__)
#define M0(...)
#define M_NOT_0(...) some_code(__VA_ARGS__)

但是这里的最后一行显然是无效的,我想不出让这个模式起作用的方法。

注意事项:

  • id 是 0 到 255 之间的整数,但理想情况下我想避免创建 256 个单独的宏定义。
  • 请不要挑战问题的前提。 M(id,...) 宏本身无法更改。
  • 无法对扩展到的最终代码做出任何假设。

最佳答案

宏 CHECK0 根据宏中遇到的标记数工作。

如果传递给宏的标记的值为 0,它会扩展为 HIDDEN0,扩展为两个标记。否则它扩展为一个不存在的宏,这个宏被认为是一个标记。

然后宏 SECOND 选择第二个标记。如果遇到HIDDEN0,则选择0,如果遇到不存在的token,则选择1。

然后将结果与用户选择的前缀连接起来。这可以在宏 HELLO 和 PRINT 中看到。一个是普通宏,另一个是宏函数。生成的宏是 HELLO0 或 HELLO1。一个被定义为有用的东西,另一个被定义为空的。打印也是如此。

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

#define EXPAND(...) __VA_ARGS__ //needed for MSVC compatibility

#define JOIN_EXPAND( a , b ) a##b
#define JOIN( a , b ) JOIN_EXPAND( a , b )

#define SECOND_EXPAND( a , b , ... ) b
#define SECOND(...) EXPAND( SECOND_EXPAND( __VA_ARGS__ ) )

#define HIDDEN0 unused,0
#define CHECK0( value ) SECOND( JOIN( HIDDEN , value ) , 1 , unused )

#define HELLO0 puts( "HELLO" )
#define HELLO1
#define HELLO( value ) JOIN( HELLO , CHECK0( value ) )

#define PRINT0( ... ) printf( __VA_ARGS__ )
#define PRINT1( ... )
#define PRINT( value , ... ) JOIN( PRINT , CHECK0( value ) )( __VA_ARGS__ )

int main( void )
{
HELLO( 54545 ) ; //evaluates to nothing
HELLO( 1 ) ; //evaluates to nothing
HELLO( 0 ) ; //evaluates to puts( "HELLO" )

PRINT( 861151 , "Some values: %lf %d\n" , 3.13 , 12345 ) ; //evaluates to nothing
PRINT( 1 , "Some values: %lf %d\n" , 3.13 , 12345 ) ; //evaluates to nothing
PRINT( 0 , "Some values: %lf %d\n" , 3.13 , 12345 ) ; //evaluates to printf( "Som

printf( "%d %d %d\n", CHECK0( 0 ) , CHECK0( 1 ) , CHECK0( 123456 ) ) ; //outputs 0 1 1
return EXIT_SUCCESS ;
}

关于c - 根据参数值展开宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204454/

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