我正在致力于设计一个通用队列
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) 或每次传递字符时创建一个新变量
您可以创建一个宏来测试参数是否是 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”评估进行优化