문제

I am currently starting out with programming micro controllers using C30 (A C compiler based on GCC from microchip for their PIC24 devices) and I enabled Strict ANSI warnings out of curiosity. First off, I did not know that in C11 comment markings like // are "wrong" and instead I should use /* blah blah */, but what really surprised me is this warning for a line of code.

"warning: use of non-standard binary prefix"

The line of code is:

OSCCONbits.COSC = 0b000;

I have looked online at one of the drafts of C11 (ISO/IEC 9899:2011) and can't find anything about binary prefixes in C. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

What is the correct binary notation for C according to C11?

도움이 되었습니까?

해결책

C does not have binary constants. (Even in C11 they are not supported.)

They were proposed as an addition to C99 but the proposition was rejected.

From C99 Rationale document:

A proposal to add binary constants was rejected due to lack of precedent and insufficient utility.

You said you are using a compiler based gcc and gcc supports binary constants: they are a GNU extension to the C language.

Integer constants can be written as binary constants, consisting of a sequence of 0 and 1 digits, prefixed by 0b or 0B. This is particularly useful in environments that operate a lot on the bit-level (like microcontrollers).

See gcc page about binary constants for more information:

http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html

다른 팁

Regarding standards:

  • ANSI C / "Strict ANSI" typically refers to the first standard version of C, standardized only in the USA 1989. Sometimes it is referred to as "C89".
  • ANSI C/89 became obsolete in 1990 when C became an international C standard, ISO/IEC 9899:1990, referred to as "C90". C89 and C90 are equivalent when it comes to technical details.
  • C90 became obsolete in 1999, when ISO C was updated. The new standard is referred to as "C99".
  • C99 became obsolete in 2011. The new standard is referred to as "C11".

Regarding your compiler problems:

  • C89/C90 does not allow // comments. They were introduced in C99. They have not been removed in C11.
  • Binary notation has never been part of any C standard.

Conclusion:

  • You are most likely compiling the code on a C90 compiler, with some non-standard extensions available.

C11 does not have binary literals; it only has decimal, octal, and hexadecimal, as described in section 6.4.4.1 of the standard. This is unchanged from C99.

6.6 paragraph 10 says:

An implementation may accept other forms of constant expressions.

which, if I understand it correctly, permits the kind of extension that your compiler provides; this is also unchanged from C99.

The usual workaround is to use hexadecimal literals; each hexadecimal digit corresponds to four binary digits. (And of course 0b000 can be written simply as 0.)

Binary prefixes are not standard. convert them to octal (0) or hexadecimal (0x) instead, which are only prefixes defined in the standard.

Also, // comments were introduced in C99 standard, they're not present in C89 ANSI standard. That's why your compiler gives you a warning.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top