使用预处理器指令生成成员名称?

Posted

技术标签:

【中文标题】使用预处理器指令生成成员名称?【英文标题】:Generate a member name using preprocessor directives? 【发布时间】:2021-03-01 08:31:24 【问题描述】:

我想实现以下目标,但我做不到:

struct SamplerState

    int i;
;

#define SAMPLER_TYPE Point
#define SAMPLER_MODE_U ClampU
#define SAMPLER_MODE_V ClampV
#define SAMPLER_NAME( a, b, c ) ( ##a ##_ ##b ##_ ##c)
#define SAMPLER SamplerState SAMPLER_NAME(SAMPLER_TYPE, SAMPLER_MODE_U, SAMPLER_MODE_V)

int main()

    SAMPLER = ;

我希望SAMPLER 的名称为Point_ClampU_ClampV,但调试时不是,而是SAMPLER_TYPE_SAMPLER_MODE_U_SAMPLER_MODE_V

问题:

如果可能的话,我怎样才能做到这一点?

【问题讨论】:

(#a "_" #b "_" #c) 之类的东西不能解决问题吗? @Nederes 一个哈希:字符串化,两个哈希:令牌粘贴。而且,字符串文字不能是标识符。 有什么必要做这样的黑客攻击?即使你可以做到,你也不应该这样做! 好吧,长话短说,在着色器中,您不能使用超过 16 个采样器,因此,我可以根据 UI 中的切换设置的一些定义动态生成正确的采样器. 【参考方案1】:
    您不能在(##a 中加入(a。没必要。 您必须有另一个级别的扩展,另一个宏,才能让abc 扩展。

struct SamplerState

    int i;
;


#define SAMPLER_TYPE Point
#define SAMPLER_MODE_U ClampU
#define SAMPLER_MODE_V ClampV
#define SAMPLER_NAME_IN(a, b, c)  ( a##_ ##b##_##c )
#define SAMPLER_NAME(a, b, c)  SAMPLER_NAME_IN(a, b, c)
#define SAMPLER SamplerState SAMPLER_NAME(SAMPLER_TYPE, SAMPLER_MODE_U, SAMPLER_MODE_V)

int main()

    SAMPLER = ;

【讨论】:

以上是关于使用预处理器指令生成成员名称?的主要内容,如果未能解决你的问题,请参考以下文章

使用 X-lists 和预处理器指令生成可配置的 C 代码 在编译时

预处理器指令反射注入

C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif

GCC - 打印结构的定义

C#预处理器命令

预处理器指令