- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我似乎无法将参数传递给需要不同参数的函数(或传递给实现第一个类型的子集的其他 _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/
给定以下源代码: #include #include #include static inline void closedirp(DIR **p) { if (*p) c
在 C11 中,我可以创建一个原型(prototype)如下所示的函数: void myVaFunc(const char* const conv, ...); 我可以这样运行它: myVaFunc(
我正在阅读这个 C11 的 _Generic维基百科上的例子: #define cbrt(X) _Generic((X), long double: cbrtl, \
我需要在 C 中使用 _Generic,以便能够根据变量类型返回专门的值。 const char *encode_char_ptr(char *x) { return (x ? x : "NU
所以我正在尝试实现“通用打印宏”: #include #include #define CHECK(x) printf(#x " =" \ _Generic((x), float:
我试图学习如何使用“新的”C11 泛型表达式,但我遇到了困难。 考虑以下代码: #include #include #define test(X, Y, c) \ _Generic((X)
如何向 c11 _Generic Functions 添加额外类型? 您是否必须#undef/re-#define 它?(如果是这样,下面的工作是否可行)还是有更好的方法? #define to_st
我对 C11 的 _Generic 机制感到高兴 - 类型切换是我在 C++ 中怀念的东西。然而,事实证明它很难编写。 例如,给定函数: bool write_int(int); bool write
有没有办法在同一表达式中多次使用 _Generic 关键字来创建单个字符串文字? 我正在寻找的是一种生成单一格式字符串以传递给 printf 的方法,所有转换说明符都适合适当的类型。 写this时答案
我有一个这样的模板: template.h ---------- // Declare a function "func_type()" void JOIN(func_, T)(T t) { retu
我正在使用 C 的在线编译器和调试器。此网页使用 GCC 5.4.1 C99。当我测试这段代码时, https://www.onlinegdb.com/online_c_compiler #inclu
在下面的代码中: struct Person { char* name; int age; }; struct Book { char* title; char* au
我正在设置一些大宽度整数类型,因此我大量使用宏来使这些类型尽可能像基本整数类型一样可用。我一直遇到的一个问题是,如果我在宏扩展中大量使用 _Generic 表达式,而不是最小化 _Generic 使用
我想在C中组合两种类型来调用函数(例如具有不同列和行的乘法 vector 和矩阵): #define CC_FIRST(a) _Generic((a), int: int8d) #def
我有兴趣编写一个类型验证宏,它只在类型不是 int/short/long 或指针时发出警告。 我遇到的问题是指针可以是任何类型的指针。 #define INT_OR_POINTER_AS_UINTPT
我似乎无法将参数传递给需要不同参数的函数(或传递给实现第一个类型的子集的其他 _Generic 宏)。 #define DEBUG_PRINT(x,...) _Generic((x),
可能我在这里做错了一些非常基本的事情,但我无法弄清楚那可能是什么。我可以解释我的代码片段,但我认为我在这里尝试做的事情非常明显:为我的 DynamicArray 的 dynarr_printf 创建一
我正在尝试在 C11 中使用 _Generic 宏生成重载函数,并且我已经停止了对零参数函数的支持,例如: #define msg(_1) _Generic((_1), char*: msg_stri
使用 gcc.exe(Rev3,由 MSYS2 项目构建)8.2.0。 我试图构建一个宏来自动在两种类型之间进行类型转换,其中两个参数永远不应该是同一类型。我的问题是如果我不包含相同类型的情况,编译器
我想使用 C11 _Generic 关键字根据静态类型填充 union ,如: typedef union { double d; long l; const char*s;
我是一名优秀的程序员,十分优秀!