| <html lang="en"> |
| <head> |
| <title>Implementation-defined behavior - The C Preprocessor</title> |
| <meta http-equiv="Content-Type" content="text/html"> |
| <meta name="description" content="The C Preprocessor"> |
| <meta name="generator" content="makeinfo 4.13"> |
| <link title="Top" rel="start" href="index.html#Top"> |
| <link rel="up" href="Implementation-Details.html#Implementation-Details" title="Implementation Details"> |
| <link rel="next" href="Implementation-limits.html#Implementation-limits" title="Implementation limits"> |
| <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> |
| <!-- |
| Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, |
| 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, |
| 2008, 2009, 2010 |
| Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 or |
| any later version published by the Free Software Foundation. A copy of |
| the license is included in the |
| section entitled ``GNU Free Documentation License''. |
| |
| This manual contains no Invariant Sections. The Front-Cover Texts are |
| (a) (see below), and the Back-Cover Texts are (b) (see below). |
| |
| (a) The FSF's Front-Cover Text is: |
| |
| A GNU Manual |
| |
| (b) The FSF's Back-Cover Text is: |
| |
| You have freedom to copy and modify this GNU Manual, like GNU |
| software. Copies published by the Free Software Foundation raise |
| funds for GNU development. |
| --> |
| <meta http-equiv="Content-Style-Type" content="text/css"> |
| <style type="text/css"><!-- |
| pre.display { font-family:inherit } |
| pre.format { font-family:inherit } |
| pre.smalldisplay { font-family:inherit; font-size:smaller } |
| pre.smallformat { font-family:inherit; font-size:smaller } |
| pre.smallexample { font-size:smaller } |
| pre.smalllisp { font-size:smaller } |
| span.sc { font-variant:small-caps } |
| span.roman { font-family:serif; font-weight:normal; } |
| span.sansserif { font-family:sans-serif; font-weight:normal; } |
| --></style> |
| <link rel="stylesheet" type="text/css" href="../cs.css"> |
| </head> |
| <body> |
| <div class="node"> |
| <a name="Implementation-defined-behavior"></a> |
| <a name="Implementation_002ddefined-behavior"></a> |
| <p> |
| Next: <a rel="next" accesskey="n" href="Implementation-limits.html#Implementation-limits">Implementation limits</a>, |
| Up: <a rel="up" accesskey="u" href="Implementation-Details.html#Implementation-Details">Implementation Details</a> |
| <hr> |
| </div> |
| |
| <h3 class="section">11.1 Implementation-defined behavior</h3> |
| |
| <p><a name="index-implementation_002ddefined-behavior-109"></a> |
| This is how CPP behaves in all the cases which the C standard |
| describes as <dfn>implementation-defined</dfn>. This term means that the |
| implementation is free to do what it likes, but must document its choice |
| and stick to it. |
| <!-- FIXME: Check the C++ standard for more implementation-defined stuff. --> |
| |
| <ul> |
| <li>The mapping of physical source file multi-byte characters to the |
| execution character set. |
| |
| <p>The input character set can be specified using the |
| <samp><span class="option">-finput-charset</span></samp> option, while the execution character set may |
| be controlled using the <samp><span class="option">-fexec-charset</span></samp> and |
| <samp><span class="option">-fwide-exec-charset</span></samp> options. |
| |
| <li>Identifier characters. |
| <a name="Identifier-characters"></a>The C and C++ standards allow identifiers to be composed of ‘<samp><span class="samp">_</span></samp>’ |
| and the alphanumeric characters. C++ and C99 also allow universal |
| character names, and C99 further permits implementation-defined |
| characters. GCC currently only permits universal character names if |
| <samp><span class="option">-fextended-identifiers</span></samp> is used, because the implementation of |
| universal character names in identifiers is experimental. |
| |
| <p>GCC allows the ‘<samp><span class="samp">$</span></samp>’ character in identifiers as an extension for |
| most targets. This is true regardless of the <samp><span class="option">std=</span></samp> switch, |
| since this extension cannot conflict with standards-conforming |
| programs. When preprocessing assembler, however, dollars are not |
| identifier characters by default. |
| |
| <p>Currently the targets that by default do not permit ‘<samp><span class="samp">$</span></samp>’ are AVR, |
| IP2K, MMIX, MIPS Irix 3, ARM aout, and PowerPC targets for the AIX |
| operating system. |
| |
| <p>You can override the default with <samp><span class="option">-fdollars-in-identifiers</span></samp> or |
| <samp><span class="option">fno-dollars-in-identifiers</span></samp>. See <a href="fdollars_002din_002didentifiers.html#fdollars_002din_002didentifiers">fdollars-in-identifiers</a>. |
| |
| <li>Non-empty sequences of whitespace characters. |
| |
| <p>In textual output, each whitespace sequence is collapsed to a single |
| space. For aesthetic reasons, the first token on each non-directive |
| line of output is preceded with sufficient spaces that it appears in the |
| same column as it did in the original source file. |
| |
| <li>The numeric value of character constants in preprocessor expressions. |
| |
| <p>The preprocessor and compiler interpret character constants in the |
| same way; i.e. escape sequences such as ‘<samp><span class="samp">\a</span></samp>’ are given the |
| values they would have on the target machine. |
| |
| <p>The compiler evaluates a multi-character character constant a character |
| at a time, shifting the previous value left by the number of bits per |
| target character, and then or-ing in the bit-pattern of the new |
| character truncated to the width of a target character. The final |
| bit-pattern is given type <code>int</code>, and is therefore signed, |
| regardless of whether single characters are signed or not (a slight |
| change from versions 3.1 and earlier of GCC). If there are more |
| characters in the constant than would fit in the target <code>int</code> the |
| compiler issues a warning, and the excess leading characters are |
| ignored. |
| |
| <p>For example, <code>'ab'</code> for a target with an 8-bit <code>char</code> would be |
| interpreted as ‘<samp><span class="samp">(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')</span></samp>’<!-- /@w -->, and <code>'\234a'</code> as ‘<samp><span class="samp">(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')</span></samp>’<!-- /@w -->. |
| |
| <li>Source file inclusion. |
| |
| <p>For a discussion on how the preprocessor locates header files, |
| <a href="Include-Operation.html#Include-Operation">Include Operation</a>. |
| |
| <li>Interpretation of the filename resulting from a macro-expanded |
| ‘<samp><span class="samp">#include</span></samp>’ directive. |
| |
| <p>See <a href="Computed-Includes.html#Computed-Includes">Computed Includes</a>. |
| |
| <li>Treatment of a ‘<samp><span class="samp">#pragma</span></samp>’ directive that after macro-expansion |
| results in a standard pragma. |
| |
| <p>No macro expansion occurs on any ‘<samp><span class="samp">#pragma</span></samp>’ directive line, so the |
| question does not arise. |
| |
| <p>Note that GCC does not yet implement any of the standard |
| pragmas. |
| |
| </ul> |
| |
| </body></html> |
| |