使用预处理器指令生成成员名称?
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
。没必要。
您必须有另一个级别的扩展,另一个宏,才能让a
、b
和c
扩展。
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 代码 在编译时