- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
给定以下源代码:
#include <stddef.h>
#include <sys/types.h>
#include <dirent.h>
static inline void closedirp(DIR **p) {
if (*p)
closedir(*p);
}
#define auto_cleanup(resource) _Generic((resource), \
DIR **: closedirp, \
)(resource)
int main() {
#ifdef GENERIC
__attribute__((cleanup(auto_cleanup))) DIR * t2 = NULL;
t2 = opendir("/tmp");
#else
__attribute__((cleanup(closedirp))) DIR * t1 = NULL;
t1 = opendir("/tmp");
#endif
}
它编译和运行没有泄漏,没有定义。但是,当定义 GENERIC 时,编译会失败:
$ gcc foo.c -DGENERIC
foo.c: In function ‘main’:
foo.c:16:2: error: cleanup argument not a function
__attribute__((cleanup(auto_cleanup))) DIR * t2 = NULL;
^
这是对 _Generic 毫无意义的使用,但我想扩展它并处理多种类型的资源以自动清理。
最佳答案
_Generic
不是一个函数,而是一个开始主表达式的关键字。
但是在这里,您似乎走错了路:auto_cleanup
是一个宏。像宏这样的函数有一个特殊性,如果后面没有 ()
,它们就不会展开。所以在这里您只需保留标识符 auto_cleanup
用于编译的后期阶段。但是对于这些后续阶段,此标识符并未声明为任何内容。
总结:
_Generic
表达式并决定采用该 _Generic
表达式的哪个分支在所有这些中,没有涉及可用于 gcc 的 cleanup
扩展的函数或函数指针。
关于_Generic 可以是一个函数吗?或者 _Generic 可以与 __attribute__((cleanup)) 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27639149/
给定以下源代码: #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;
我是一名优秀的程序员,十分优秀!