Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-表示#定义中的二进制_C_Binary - Fatal编程技术网

C-表示#定义中的二进制

C-表示#定义中的二进制,c,binary,C,Binary,下面的代码片段按原样工作,但如果我取消注释第一个#定义并注释第二个,编译器会抱怨在赋值语句中需要一个“')。我想这可能是想要一个演员,但这没有帮助。请指出我愚蠢的疏忽 谢谢, jh /#define SMI_READ(0b10一般来说,要回答这样的问题,我们需要查看错误消息的完整且未经编辑的文本,如果您提供一个我们可以尝试为自己编译的完整程序,这也会非常有帮助。(在您看来,错误消息似乎是无用的,但通常情况下,只有当您知道如何像编译器工程师一样思考时,它们才有意义。) 但是,在这种情况下,我可以做

下面的代码片段按原样工作,但如果我取消注释第一个#定义并注释第二个,编译器会抱怨在赋值语句中需要一个“')。我想这可能是想要一个演员,但这没有帮助。请指出我愚蠢的疏忽

谢谢, jh


/#define SMI_READ(0b10一般来说,要回答这样的问题,我们需要查看错误消息的完整且未经编辑的文本,如果您提供一个我们可以尝试为自己编译的完整程序,这也会非常有帮助。(在您看来,错误消息似乎是无用的,但通常情况下,只有当您知道如何像编译器工程师一样思考时,它们才有意义。)


但是,在这种情况下,我可以做出一个高置信度的猜测,因为两个宏之间的唯一区别是,不工作的宏使用二进制数,
0b10
,而工作的宏使用十六进制数,
0x2
。二进制数不是任何版本的C标准的一部分,尽管它们是常见的扩展。因此,我推断您的编译器不支持它们,并且在遇到它们时会给出不清楚的错误消息。

一般来说,要回答这样的问题,我们需要查看错误消息的完整和未编辑的文本,如果您提供一个完整的程序,我们可以尝试为您可能觉得错误消息是无用的,但通常情况下,只有当您知道如何像编译器工程师一样思考时,错误消息才有意义

但是,在这种情况下,我可以做出一个高置信度的猜测,因为两个宏之间的唯一区别是,不工作的宏使用二进制数,
0b10
,而工作的宏使用十六进制数,
0x2
。二进制数不是任何版本的C标准的一部分,尽管它们是常见的因此,我推断您的编译器不支持它们,并且在遇到它们时给出了不清楚的错误消息。

来自C标准()

6.4.4.1整数常量

八进制常数:
0
八进制常数八进制数字

十六进制前缀:
0x

没有描述其他前缀,特别是没有涉及C标准()

6.4.4.1整数常量

八进制常数:
0
八进制常数八进制数字

十六进制前缀:
0x


没有描述其他前缀,特别是没有任何包含
0b10

0b10
的前缀不是标准C的一部分。为什么
0x2@clcto可能在这个硬件寄存器的偏移量10处有一个两位字段。
定义SMI\u读取(1u我提到C++添加了二进制代码,比如<代码> 0B10</代码>,但是问题是关于C,所以我不会提出来。但是我会提到GCC支持二进制常量作为扩展,其他C编译器也可能做得更好。如果C标准增加二进制常量,我不会感到惊讶,但我没有屏住呼吸。.
0b10
不是标准C的一部分。为什么
0x2@clcto可能在这个硬件寄存器的偏移量10处有一个两位字段。
\define SMI\u READ(1u我提到C++添加了二进制代码,比如<代码> 0B10</代码>,但是问题是关于C,所以我不会提出来。但是我会提到GCC支持二进制常量作为扩展,其他C编译器也可能做得更好。如果C标准增加二进制常量,我不会感到惊讶,但我没有屏住呼吸。.Detail:C没有十六进制文字,但有字符串和复合文字,这两种文字都可以使用它们的地址。
0x2
是一个C十六进制常量。它的地址不能使用。@chux我想称它们为“十六进制常量”和“二进制常量”将以另一种方式混淆-常量有名称,不是吗?-因此我将其改为“二进制数”和“十六进制数”。“十六进制数”比规范中的“十六进制常量”更清晰吗.IDK.C中的常量包括
123
0x123
'x'
2.0
&枚举常量。最后一个常量有名称。详细信息:C没有十六进制文字,但有字符串和复合文字,它们都可以获取地址。
0x2
是C十六进制常量。其地址不能获取@chux我想叫它们“十六进制常量”和“二进制常量”会有不同的混淆方式-常量有名称,不是吗?-所以我把它改为“二进制数”和“十六进制数”。“十六进制数”比规范中的“十六进制常量”更清楚吗.IDK.C中的常量包括
123
0x123
'x'
2.0
&枚举常量。最后一个常量有名称。
//#define SMI_READ  (0b10 << 10)
#define SMI_READ  (0x2 << 10)
    ...
    command |= SMI_READ;