What to do to make '_Generic('a', char : 1, int : 2) == 1' true

huangapple go评论75阅读模式
英文:

What to do to make '_Generic('a', char : 1, int : 2) == 1' true

问题

编译器是否可以将类型'a'设置为char,而不是int?这会使这些表达式的值为真:

sizeof('a') == 1

_Generic('a', char : true, default : false)

在gcc中,_Generic('a', char : true, default : false) == false

英文:

Is there any way the compiler can set the type 'a' to char, instead of int.
This makes the values of these expressions true:

sizeof('a') == 1

_Generic('a', char : true, default : false)

In gcc _Generic('a', char : true, default : false) == false

答案1

得分: 1

问题是,C 中的字符常量是 int 而不是 char。这是C语言的一个众所周知的缺陷。解决这个问题的一个简单方法是将特定文件编译为C++,然后将生成的 .o 文件与C项目的其余部分链接起来。

否则,您将不得不通过某些神秘的宏来发明自己的自定义表示法,这真的是不推荐的。例如:

#include <stdio.h>

#define CH(c) (#c [0])

int main(void)
{
  printf("%c %zu\n", CH(a), sizeof(CH(a)));
}

类似地,"a"[0]*"a" 将输出类型为 char 大小为 1 的字母 a

这仍然允许十六进制转义序列等操作,例如 CH(\x61) 可以打印出 a

英文:

The problem is that character constants in C are int, not char. This is a well-known flaw of the C language. One easy solution to the problem might be to compile a specific file as C++, then link the generated .o file with the rest of the C project.

Otherwise you'd have to invent your own custom notation through some mysterious macro, which is really NOT recommended. For example:

#include &lt;stdio.h&gt;

#define CH(c) (#c [0])

int main (void)
{
  printf(&quot;%c %zu\n&quot;, CH(a), sizeof(CH(a)) );
}

Similarly, &quot;a&quot;[0] or *&quot;a&quot; will give the letter a of type char with size 1.

This will still allow hex escape sequences and the like, such as CH(\x61) to print a.

答案2

得分: 0

你可以使用(char)'a'来代替a

sizeof((char)'a')   // 1
_Generic((char)'a', char: true, default: false)  // true
英文:

You can use (char)&#39;a&#39; instead of a.

sizeof( (char)&#39;a&#39; )   // 1
_Generic( (char)&#39;a&#39;, char : true, default : false )  // true

huangapple
  • 本文由 发表于 2023年7月17日 12:32:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/76701502.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定