[英]C Unicode: How do I apply C11 standard amendment DR488 fix to C11 standard function c16rtomb()?
[英]How do I use a binary prefix in accordance with C11?
我目前正在开始使用C30
编程微控制器(基于GCC
C
编译器,用于他们的PIC24
器件的微芯片),我出于好奇而启用了Strict ANSI warnings
。 首先,我不知道在C11评论标记如//是“错误的”而我应该使用/ * blah blah * /,但真正令我感到惊讶的是这一行代码警告。
“警告:使用非标准二进制前缀”
代码行是:
OSCCONbits.COSC = 0b000;
我已经在线查看了C11(ISO / IEC 9899:2011)的草案之一,并且在C中找不到关于二进制前缀的任何内容.http://www.open-std.org/jtc1/sc22/wg14/www /docs/n1570.pdf
根据C11,C的正确二进制表示法是什么?
C没有二进制常量。 (即使在C11中也不支持它们。)
他们被提议作为C99的补充,但该提议遭到拒绝。
来自C99理由文件:
添加二进制常量的提议由于缺乏先例和实用程序不足而被拒绝。
你说你使用的是基于gcc
的编译器,而gcc
支持二进制常量:它们是C语言的GNU扩展。
整数常量可以写成二进制常量,由
0
和1
位的序列组成,前缀为0b
或0B
。 这在位级操作很多的环境(如微控制器)中特别有用。
有关更多信息,请参阅有关二进制常量的gcc
页面:
C11没有二进制文字; 它只有十进制,八进制和十六进制,如标准6.4.4.1节所述。 这与C99相同。
6.6第10段说:
实现可以接受其他形式的常量表达式。
如果我理解正确,它允许你的编译器提供的那种扩展; 这与C99相同。
通常的解决方法是使用十六进制文字; 每个十六进制数字对应四个二进制数字。 (当然0b000
可以写成0
)
关于标准:
关于编译问题:
结论:
二进制前缀不是标准的。 将它们转换为八进制( 0
)或十六进制( 0x
),它们只是标准中定义的前缀。
此外, //
注释是在C99标准中引入的,它们不存在于C89 ANSI标准中。 这就是你的编译器给你一个警告的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.