如何将 char 视为 c 中 _generic 中的 char

Bha*_*dan 5 c generics

我正在致力于设计一个通用队列

https://github.com/Bhaumik-Tandan/Generic_queue_in_c

但是当我为所有类型的数据类型创建通用函数队列时,我遇到了一个问题

#define enqueue(s,a) _Generic(a, int: enqueuei__19BIT0292, char*: enqueues__19BIT0292,double: enqueuef__19BIT0292,char:enqueuec__19BIT0292,float:enqueuef__19BIT0292)(s,a)
Run Code Online (Sandbox Code Playgroud)

下面的行将“c”视为 int 并调用相应的函数。

enqueue(s,'c')
Run Code Online (Sandbox Code Playgroud)

而如果我想调用 char 函数,我需要写

enqueue(s,(char)'c')
Run Code Online (Sandbox Code Playgroud)

我知道在 C 中字符在内部被视为整数,但是有什么方法可以解决这个问题,我不想在括号中写入 (char) 或每次传递字符时创建一个新变量

WEN*_*DYN 5

您可以创建一个宏来测试参数是否是 a char (以 开头',如下所示:

#define is_char_literal(c) (#c[0] == '\'')
Run Code Online (Sandbox Code Playgroud)

那么你可以使用外部

#define enqueue(s,a) is_char_literal(a)? enqueuec__19BIT0292(s,a): __Generic(a, int: enqueuei__19BIT0292, char*: enqueues__19BIT0292,double: enqueuef__19BIT0292, char:enqueuec__19BIT0292, float:enqueuef__19BIT0292)(s,a)
Run Code Online (Sandbox Code Playgroud)

并取决于编译器,如果您的编译器支持通过“const”评估进行优化

  • @尤金·什。根据 GCC 中带有 -O3 标志的 [https://godbolt.org/](https://godbolt.org/),它不会增加任何额外的开销 (2认同)
  • 我建议将 `ischar` 重命名为 `is_char_literal` (2认同)