- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要在 C 中使用 _Generic,以便能够根据变量类型返回专门的值。
const char *encode_char_ptr(char *x)
{
return (x ? x : "NULL");
}
....
#define encode(x) _Generic((x), \
char *: encode_char_ptr, \
const char *: encode_const_char_ptr, \
bool: encode_bool, \
default: return_param)(x)
因此对于各种类型有一个专门的处理返回一些字符串,但对于其余的(默认),将返回参数本身。 “return_param”的可能实现是什么?还是我必须为每种可能的类型实现专门的功能?
最佳答案
您可以调用通用选择分支中的函数,然后默认分支可以简单地求出参数的值。唯一的麻烦是所有 分支必须在语义上有效。所以我们可以在这里为标量类型做一个技巧:进行另一个泛型选择。如果它是正确的类型,则按原样返回参数,否则返回转换为该类型的 0,为算术类型生成 0,或为指针类型生成空指针。该分支不会被评估,因此它是安全的。因此我们得到
#define coerce_scalar(type, arg) _Generic((arg), type: (arg), default: (type)0)
#define encode(x) _Generic((x), \
char *: encode_char_ptr(coerce_scalar(char *, (x))), \
const char *: encode_const_char_ptr(coerce_scalar(const char *, (x))), \
bool: encode_bool(coerce_scalar(bool, (x))), \
default: (x))
这也可以通过对使用 {0}
初始化的其他分支使用复合文字来扩展到结构、 union 类型 - 尽管我猜大部分情况下它会是指向结构的指针,即再次标量.
但真正的解决方案是根本不为其他类型调用 encode
。
关于C _Generic 默认返回参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57142207/
给定以下源代码: #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;
我是一名优秀的程序员,十分优秀!