gpt4 book ai didi

c - c11 _Generic 通用关联的结果表达式的每个分支是否都必须有效?

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:35 24 4
gpt4 key购买 nike

我似乎无法将参数传递给需要不同参数的函数(或传递给实现第一个类型的子集的其他 _Generic 宏)。

#define DEBUG_PRINT(x,...) _Generic((x),                    \
debug_print_options *: DEBUG_PRINT_CUSTOM_TYPE(x, __VA_ARGS__), \
default: DEBUG_PRINT_BASIC_TYPE(x, __VA_ARGS__))


#define DEBUG_PRINT_BASIC_TYPE(x,...) debug_print_printf_specifier((#x), (x), TYPE_TO_PRINTF_SPECIFIER(x), __FILE__, __LINE__, _my_func__, &((struct debug_print_options){__VA_ARGS__}))
#define DEBUG_PRINT_CUSTOM_TYPE(x,...) debug_print_custom_to_debug_string((#x), (x), GET_CREATE_DEBUG_STRING_FUNC(x), __FILE__, __LINE__, _my_func__, &((struct debug_print_options){__VA_ARGS__}))

给出一个编译错误:

debug_print.h:123:46: error: ‘_Generic’ selector of type ‘struct debug_print_options *’ is not compatible with any association

这让它看起来好像在每个分支机构都得到了评估。如果我注释掉它编译的默认值。

有没有办法解决这个问题?

最佳答案

您的编译器错误不是来自宏本身,而是来自对它们的某些调用。因此,如果您发布了导致错误的调用,将会有所帮助。话虽如此,我将解决您似乎对 _Generic 表达式提出的一般性问题。

标准规定如下(6.5.1.1,在“语义”下):

The controlling expression of a generic selection is not evaluated. If a generic selection has a generic association with a type name that is compatible with the type of the controlling expression, then the result expression of the generic selection is the expression in that generic association. Otherwise, the result expression of the generic selection is the expression in the default generic association. None of the expressions from any other generic association of the generic selection is evaluated.

因此,在回答您的评论时添加到您的问题中,不,仅评估选定的分支。

_泛型表达式是表达式,不是宏。宏不需要具有正确的语法。它甚至不需要在括号中保持平衡。宏唯一需要做的就是在每次使用时扩展为有效代码。表达方式不同。它们需要与语言的语法相匹配。

在 _Generic 表达式的情况下,每个项目的语法可以是任何有效的 C 表达式,它没有逗号运算符,未被括号(或条件运算符)屏蔽。如果你的 _Generic 满足这个条件,并且选择的语句没有引起问题,那么它就可以工作。因此,只要语法有效,它就可以工作。

在不知道变量类型的情况下使用正确的语法可能有点棘手。如果您遇到麻烦,您可以在需要的地方在“x”上插入显式强制转换,将其强制转换为该分支上的类型。这样代码是有效的,转换是多余的,将被优化掉。

至于您得到的特定错误,这听起来像是您没有匹配输入的类型并且没有默认语句时会得到的错误。同样,没有看到您的调用,很难说。但我会确保您匹配的类型完全包括限定词。我要问的一个特定问题是,如果 debug_print_options 是一个 typedef,就好像它只被定义为一个结构标记,那么您需要将“struct”放入您的 _Generic 中以正确识别类型。

关于c - c11 _Generic 通用关联的结果表达式的每个分支是否都必须有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54388683/

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