123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197 |
- @c Copyright (C) 1988-2015 Free Software Foundation, Inc.
- @c This is part of the GCC manual.
- @c For copying conditions, see the file gcc.texi.
- @node Trouble
- @chapter Known Causes of Trouble with GCC
- @cindex bugs, known
- @cindex installation trouble
- @cindex known causes of trouble
- This section describes known problems that affect users of GCC@. Most
- of these are not GCC bugs per se---if they were, we would fix them.
- But the result for a user may be like the result of a bug.
- Some of these problems are due to bugs in other software, some are
- missing features that are too much work to add, and some are places
- where people's opinions differ as to what is best.
- @menu
- * Actual Bugs:: Bugs we will fix later.
- * Interoperation:: Problems using GCC with other compilers,
- and with certain linkers, assemblers and debuggers.
- * Incompatibilities:: GCC is incompatible with traditional C.
- * Fixed Headers:: GCC uses corrected versions of system header files.
- This is necessary, but doesn't always work smoothly.
- * Standard Libraries:: GCC uses the system C library, which might not be
- compliant with the ISO C standard.
- * Disappointments:: Regrettable things we can't change, but not quite bugs.
- * C++ Misunderstandings:: Common misunderstandings with GNU C++.
- * Non-bugs:: Things we think are right, but some others disagree.
- * Warnings and Errors:: Which problems in your code get warnings,
- and which get errors.
- @end menu
- @node Actual Bugs
- @section Actual Bugs We Haven't Fixed Yet
- @itemize @bullet
- @item
- The @code{fixincludes} script interacts badly with automounters; if the
- directory of system header files is automounted, it tends to be
- unmounted while @code{fixincludes} is running. This would seem to be a
- bug in the automounter. We don't know any good way to work around it.
- @end itemize
- @node Interoperation
- @section Interoperation
- This section lists various difficulties encountered in using GCC
- together with other compilers or with the assemblers, linkers,
- libraries and debuggers on certain systems.
- @itemize @bullet
- @item
- On many platforms, GCC supports a different ABI for C++ than do other
- compilers, so the object files compiled by GCC cannot be used with object
- files generated by another C++ compiler.
- An area where the difference is most apparent is name mangling. The use
- of different name mangling is intentional, to protect you from more subtle
- problems.
- Compilers differ as to many internal details of C++ implementation,
- including: how class instances are laid out, how multiple inheritance is
- implemented, and how virtual function calls are handled. If the name
- encoding were made the same, your programs would link against libraries
- provided from other compilers---but the programs would then crash when
- run. Incompatible libraries are then detected at link time, rather than
- at run time.
- @item
- On some BSD systems, including some versions of Ultrix, use of profiling
- causes static variable destructors (currently used only in C++) not to
- be run.
- @item
- On a SPARC, GCC aligns all values of type @code{double} on an 8-byte
- boundary, and it expects every @code{double} to be so aligned. The Sun
- compiler usually gives @code{double} values 8-byte alignment, with one
- exception: function arguments of type @code{double} may not be aligned.
- As a result, if a function compiled with Sun CC takes the address of an
- argument of type @code{double} and passes this pointer of type
- @code{double *} to a function compiled with GCC, dereferencing the
- pointer may cause a fatal signal.
- One way to solve this problem is to compile your entire program with GCC@.
- Another solution is to modify the function that is compiled with
- Sun CC to copy the argument into a local variable; local variables
- are always properly aligned. A third solution is to modify the function
- that uses the pointer to dereference it via the following function
- @code{access_double} instead of directly with @samp{*}:
- @smallexample
- inline double
- access_double (double *unaligned_ptr)
- @{
- union d2i @{ double d; int i[2]; @};
- union d2i *p = (union d2i *) unaligned_ptr;
- union d2i u;
- u.i[0] = p->i[0];
- u.i[1] = p->i[1];
- return u.d;
- @}
- @end smallexample
- @noindent
- Storing into the pointer can be done likewise with the same union.
- @item
- On Solaris, the @code{malloc} function in the @file{libmalloc.a} library
- may allocate memory that is only 4 byte aligned. Since GCC on the
- SPARC assumes that doubles are 8 byte aligned, this may result in a
- fatal signal if doubles are stored in memory allocated by the
- @file{libmalloc.a} library.
- The solution is to not use the @file{libmalloc.a} library. Use instead
- @code{malloc} and related functions from @file{libc.a}; they do not have
- this problem.
- @item
- On the HP PA machine, ADB sometimes fails to work on functions compiled
- with GCC@. Specifically, it fails to work on functions that use
- @code{alloca} or variable-size arrays. This is because GCC doesn't
- generate HP-UX unwind descriptors for such functions. It may even be
- impossible to generate them.
- @item
- Debugging (@option{-g}) is not supported on the HP PA machine, unless you use
- the preliminary GNU tools.
- @item
- Taking the address of a label may generate errors from the HP-UX
- PA assembler. GAS for the PA does not have this problem.
- @item
- Using floating point parameters for indirect calls to static functions
- will not work when using the HP assembler. There simply is no way for GCC
- to specify what registers hold arguments for static functions when using
- the HP assembler. GAS for the PA does not have this problem.
- @item
- In extremely rare cases involving some very large functions you may
- receive errors from the HP linker complaining about an out of bounds
- unconditional branch offset. This used to occur more often in previous
- versions of GCC, but is now exceptionally rare. If you should run
- into it, you can work around by making your function smaller.
- @item
- GCC compiled code sometimes emits warnings from the HP-UX assembler of
- the form:
- @smallexample
- (warning) Use of GR3 when
- frame >= 8192 may cause conflict.
- @end smallexample
- These warnings are harmless and can be safely ignored.
- @item
- In extremely rare cases involving some very large functions you may
- receive errors from the AIX Assembler complaining about a displacement
- that is too large. If you should run into it, you can work around by
- making your function smaller.
- @item
- The @file{libstdc++.a} library in GCC relies on the SVR4 dynamic
- linker semantics which merges global symbols between libraries and
- applications, especially necessary for C++ streams functionality.
- This is not the default behavior of AIX shared libraries and dynamic
- linking. @file{libstdc++.a} is built on AIX with ``runtime-linking''
- enabled so that symbol merging can occur. To utilize this feature,
- the application linked with @file{libstdc++.a} must include the
- @option{-Wl,-brtl} flag on the link line. G++ cannot impose this
- because this option may interfere with the semantics of the user
- program and users may not always use @samp{g++} to link his or her
- application. Applications are not required to use the
- @option{-Wl,-brtl} flag on the link line---the rest of the
- @file{libstdc++.a} library which is not dependent on the symbol
- merging semantics will continue to function correctly.
- @item
- An application can interpose its own definition of functions for
- functions invoked by @file{libstdc++.a} with ``runtime-linking''
- enabled on AIX@. To accomplish this the application must be linked
- with ``runtime-linking'' option and the functions explicitly must be
- exported by the application (@option{-Wl,-brtl,-bE:exportfile}).
- @item
- AIX on the RS/6000 provides support (NLS) for environments outside of
- the United States. Compilers and assemblers use NLS to support
- locale-specific representations of various objects including
- floating-point numbers (@samp{.} vs @samp{,} for separating decimal
- fractions). There have been problems reported where the library linked
- with GCC does not produce the same floating-point formats that the
- assembler accepts. If you have this problem, set the @env{LANG}
- environment variable to @samp{C} or @samp{En_US}.
- @item
- @opindex fdollars-in-identifiers
- Even if you specify @option{-fdollars-in-identifiers},
- you cannot successfully use @samp{$} in identifiers on the RS/6000 due
- to a restriction in the IBM assembler. GAS supports these
- identifiers.
- @end itemize
- @node Incompatibilities
- @section Incompatibilities of GCC
- @cindex incompatibilities of GCC
- @opindex traditional
- There are several noteworthy incompatibilities between GNU C and K&R
- (non-ISO) versions of C@.
- @itemize @bullet
- @cindex string constants
- @cindex read-only strings
- @cindex shared strings
- @item
- GCC normally makes string constants read-only. If several
- identical-looking string constants are used, GCC stores only one
- copy of the string.
- @cindex @code{mktemp}, and constant strings
- One consequence is that you cannot call @code{mktemp} with a string
- constant argument. The function @code{mktemp} always alters the
- string its argument points to.
- @cindex @code{sscanf}, and constant strings
- @cindex @code{fscanf}, and constant strings
- @cindex @code{scanf}, and constant strings
- Another consequence is that @code{sscanf} does not work on some very
- old systems when passed a string constant as its format control string
- or input. This is because @code{sscanf} incorrectly tries to write
- into the string constant. Likewise @code{fscanf} and @code{scanf}.
- The solution to these problems is to change the program to use
- @code{char}-array variables with initialization strings for these
- purposes instead of string constants.
- @item
- @code{-2147483648} is positive.
- This is because 2147483648 cannot fit in the type @code{int}, so
- (following the ISO C rules) its data type is @code{unsigned long int}.
- Negating this value yields 2147483648 again.
- @item
- GCC does not substitute macro arguments when they appear inside of
- string constants. For example, the following macro in GCC
- @smallexample
- #define foo(a) "a"
- @end smallexample
- @noindent
- will produce output @code{"a"} regardless of what the argument @var{a} is.
- @cindex @code{setjmp} incompatibilities
- @cindex @code{longjmp} incompatibilities
- @item
- When you use @code{setjmp} and @code{longjmp}, the only automatic
- variables guaranteed to remain valid are those declared
- @code{volatile}. This is a consequence of automatic register
- allocation. Consider this function:
- @smallexample
- jmp_buf j;
- foo ()
- @{
- int a, b;
- a = fun1 ();
- if (setjmp (j))
- return a;
- a = fun2 ();
- /* @r{@code{longjmp (j)} may occur in @code{fun3}.} */
- return a + fun3 ();
- @}
- @end smallexample
- Here @code{a} may or may not be restored to its first value when the
- @code{longjmp} occurs. If @code{a} is allocated in a register, then
- its first value is restored; otherwise, it keeps the last value stored
- in it.
- @opindex W
- If you use the @option{-W} option with the @option{-O} option, you will
- get a warning when GCC thinks such a problem might be possible.
- @item
- Programs that use preprocessing directives in the middle of macro
- arguments do not work with GCC@. For example, a program like this
- will not work:
- @smallexample
- @group
- foobar (
- #define luser
- hack)
- @end group
- @end smallexample
- ISO C does not permit such a construct.
- @item
- K&R compilers allow comments to cross over an inclusion boundary
- (i.e.@: started in an include file and ended in the including file).
- @cindex external declaration scope
- @cindex scope of external declarations
- @cindex declaration scope
- @item
- Declarations of external variables and functions within a block apply
- only to the block containing the declaration. In other words, they
- have the same scope as any other declaration in the same place.
- In some other C compilers, an @code{extern} declaration affects all the
- rest of the file even if it happens within a block.
- @item
- In traditional C, you can combine @code{long}, etc., with a typedef name,
- as shown here:
- @smallexample
- typedef int foo;
- typedef long foo bar;
- @end smallexample
- In ISO C, this is not allowed: @code{long} and other type modifiers
- require an explicit @code{int}.
- @cindex typedef names as function parameters
- @item
- PCC allows typedef names to be used as function parameters.
- @item
- Traditional C allows the following erroneous pair of declarations to
- appear together in a given scope:
- @smallexample
- typedef int foo;
- typedef foo foo;
- @end smallexample
- @item
- GCC treats all characters of identifiers as significant. According to
- K&R-1 (2.2), ``No more than the first eight characters are significant,
- although more may be used.''. Also according to K&R-1 (2.2), ``An
- identifier is a sequence of letters and digits; the first character must
- be a letter. The underscore _ counts as a letter.'', but GCC also
- allows dollar signs in identifiers.
- @cindex whitespace
- @item
- PCC allows whitespace in the middle of compound assignment operators
- such as @samp{+=}. GCC, following the ISO standard, does not
- allow this.
- @cindex apostrophes
- @cindex @code{'}
- @item
- GCC complains about unterminated character constants inside of
- preprocessing conditionals that fail. Some programs have English
- comments enclosed in conditionals that are guaranteed to fail; if these
- comments contain apostrophes, GCC will probably report an error. For
- example, this code would produce an error:
- @smallexample
- #if 0
- You can't expect this to work.
- #endif
- @end smallexample
- The best solution to such a problem is to put the text into an actual
- C comment delimited by @samp{/*@dots{}*/}.
- @item
- Many user programs contain the declaration @samp{long time ();}. In the
- past, the system header files on many systems did not actually declare
- @code{time}, so it did not matter what type your program declared it to
- return. But in systems with ISO C headers, @code{time} is declared to
- return @code{time_t}, and if that is not the same as @code{long}, then
- @samp{long time ();} is erroneous.
- The solution is to change your program to use appropriate system headers
- (@code{<time.h>} on systems with ISO C headers) and not to declare
- @code{time} if the system header files declare it, or failing that to
- use @code{time_t} as the return type of @code{time}.
- @cindex @code{float} as function value type
- @item
- When compiling functions that return @code{float}, PCC converts it to
- a double. GCC actually returns a @code{float}. If you are concerned
- with PCC compatibility, you should declare your functions to return
- @code{double}; you might as well say what you mean.
- @cindex structures
- @cindex unions
- @item
- When compiling functions that return structures or unions, GCC
- output code normally uses a method different from that used on most
- versions of Unix. As a result, code compiled with GCC cannot call
- a structure-returning function compiled with PCC, and vice versa.
- The method used by GCC is as follows: a structure or union which is
- 1, 2, 4 or 8 bytes long is returned like a scalar. A structure or union
- with any other size is stored into an address supplied by the caller
- (usually in a special, fixed register, but on some machines it is passed
- on the stack). The target hook @code{TARGET_STRUCT_VALUE_RTX}
- tells GCC where to pass this address.
- By contrast, PCC on most target machines returns structures and unions
- of any size by copying the data into an area of static storage, and then
- returning the address of that storage as if it were a pointer value.
- The caller must copy the data from that memory area to the place where
- the value is wanted. GCC does not use this method because it is
- slower and nonreentrant.
- On some newer machines, PCC uses a reentrant convention for all
- structure and union returning. GCC on most of these machines uses a
- compatible convention when returning structures and unions in memory,
- but still returns small structures and unions in registers.
- @opindex fpcc-struct-return
- You can tell GCC to use a compatible convention for all structure and
- union returning with the option @option{-fpcc-struct-return}.
- @cindex preprocessing tokens
- @cindex preprocessing numbers
- @item
- GCC complains about program fragments such as @samp{0x74ae-0x4000}
- which appear to be two hexadecimal constants separated by the minus
- operator. Actually, this string is a single @dfn{preprocessing token}.
- Each such token must correspond to one token in C@. Since this does not,
- GCC prints an error message. Although it may appear obvious that what
- is meant is an operator and two values, the ISO C standard specifically
- requires that this be treated as erroneous.
- A @dfn{preprocessing token} is a @dfn{preprocessing number} if it
- begins with a digit and is followed by letters, underscores, digits,
- periods and @samp{e+}, @samp{e-}, @samp{E+}, @samp{E-}, @samp{p+},
- @samp{p-}, @samp{P+}, or @samp{P-} character sequences. (In strict C90
- mode, the sequences @samp{p+}, @samp{p-}, @samp{P+} and @samp{P-} cannot
- appear in preprocessing numbers.)
- To make the above program fragment valid, place whitespace in front of
- the minus sign. This whitespace will end the preprocessing number.
- @end itemize
- @node Fixed Headers
- @section Fixed Header Files
- GCC needs to install corrected versions of some system header files.
- This is because most target systems have some header files that won't
- work with GCC unless they are changed. Some have bugs, some are
- incompatible with ISO C, and some depend on special features of other
- compilers.
- Installing GCC automatically creates and installs the fixed header
- files, by running a program called @code{fixincludes}. Normally, you
- don't need to pay attention to this. But there are cases where it
- doesn't do the right thing automatically.
- @itemize @bullet
- @item
- If you update the system's header files, such as by installing a new
- system version, the fixed header files of GCC are not automatically
- updated. They can be updated using the @command{mkheaders} script
- installed in
- @file{@var{libexecdir}/gcc/@var{target}/@var{version}/install-tools/}.
- @item
- On some systems, header file directories contain
- machine-specific symbolic links in certain places. This makes it
- possible to share most of the header files among hosts running the
- same version of the system on different machine models.
- The programs that fix the header files do not understand this special
- way of using symbolic links; therefore, the directory of fixed header
- files is good only for the machine model used to build it.
- It is possible to make separate sets of fixed header files for the
- different machine models, and arrange a structure of symbolic links so
- as to use the proper set, but you'll have to do this by hand.
- @end itemize
- @node Standard Libraries
- @section Standard Libraries
- @opindex Wall
- GCC by itself attempts to be a conforming freestanding implementation.
- @xref{Standards,,Language Standards Supported by GCC}, for details of
- what this means. Beyond the library facilities required of such an
- implementation, the rest of the C library is supplied by the vendor of
- the operating system. If that C library doesn't conform to the C
- standards, then your programs might get warnings (especially when using
- @option{-Wall}) that you don't expect.
- For example, the @code{sprintf} function on SunOS 4.1.3 returns
- @code{char *} while the C standard says that @code{sprintf} returns an
- @code{int}. The @code{fixincludes} program could make the prototype for
- this function match the Standard, but that would be wrong, since the
- function will still return @code{char *}.
- If you need a Standard compliant library, then you need to find one, as
- GCC does not provide one. The GNU C library (called @code{glibc})
- provides ISO C, POSIX, BSD, SystemV and X/Open compatibility for
- GNU/Linux and HURD-based GNU systems; no recent version of it supports
- other systems, though some very old versions did. Version 2.2 of the
- GNU C library includes nearly complete C99 support. You could also ask
- your operating system vendor if newer libraries are available.
- @node Disappointments
- @section Disappointments and Misunderstandings
- These problems are perhaps regrettable, but we don't know any practical
- way around them.
- @itemize @bullet
- @item
- Certain local variables aren't recognized by debuggers when you compile
- with optimization.
- This occurs because sometimes GCC optimizes the variable out of
- existence. There is no way to tell the debugger how to compute the
- value such a variable ``would have had'', and it is not clear that would
- be desirable anyway. So GCC simply does not mention the eliminated
- variable when it writes debugging information.
- You have to expect a certain amount of disagreement between the
- executable and your source code, when you use optimization.
- @cindex conflicting types
- @cindex scope of declaration
- @item
- Users often think it is a bug when GCC reports an error for code
- like this:
- @smallexample
- int foo (struct mumble *);
- struct mumble @{ @dots{} @};
- int foo (struct mumble *x)
- @{ @dots{} @}
- @end smallexample
- This code really is erroneous, because the scope of @code{struct
- mumble} in the prototype is limited to the argument list containing it.
- It does not refer to the @code{struct mumble} defined with file scope
- immediately below---they are two unrelated types with similar names in
- different scopes.
- But in the definition of @code{foo}, the file-scope type is used
- because that is available to be inherited. Thus, the definition and
- the prototype do not match, and you get an error.
- This behavior may seem silly, but it's what the ISO standard specifies.
- It is easy enough for you to make your code work by moving the
- definition of @code{struct mumble} above the prototype. It's not worth
- being incompatible with ISO C just to avoid an error for the example
- shown above.
- @item
- Accesses to bit-fields even in volatile objects works by accessing larger
- objects, such as a byte or a word. You cannot rely on what size of
- object is accessed in order to read or write the bit-field; it may even
- vary for a given bit-field according to the precise usage.
- If you care about controlling the amount of memory that is accessed, use
- volatile but do not use bit-fields.
- @item
- GCC comes with shell scripts to fix certain known problems in system
- header files. They install corrected copies of various header files in
- a special directory where only GCC will normally look for them. The
- scripts adapt to various systems by searching all the system header
- files for the problem cases that we know about.
- If new system header files are installed, nothing automatically arranges
- to update the corrected header files. They can be updated using the
- @command{mkheaders} script installed in
- @file{@var{libexecdir}/gcc/@var{target}/@var{version}/install-tools/}.
- @item
- @cindex floating point precision
- On 68000 and x86 systems, for instance, you can get paradoxical results
- if you test the precise values of floating point numbers. For example,
- you can find that a floating point value which is not a NaN is not equal
- to itself. This results from the fact that the floating point registers
- hold a few more bits of precision than fit in a @code{double} in memory.
- Compiled code moves values between memory and floating point registers
- at its convenience, and moving them into memory truncates them.
- @opindex ffloat-store
- You can partially avoid this problem by using the @option{-ffloat-store}
- option (@pxref{Optimize Options}).
- @item
- On AIX and other platforms without weak symbol support, templates
- need to be instantiated explicitly and symbols for static members
- of templates will not be generated.
- @item
- On AIX, GCC scans object files and library archives for static
- constructors and destructors when linking an application before the
- linker prunes unreferenced symbols. This is necessary to prevent the
- AIX linker from mistakenly assuming that static constructor or
- destructor are unused and removing them before the scanning can occur.
- All static constructors and destructors found will be referenced even
- though the modules in which they occur may not be used by the program.
- This may lead to both increased executable size and unexpected symbol
- references.
- @end itemize
- @node C++ Misunderstandings
- @section Common Misunderstandings with GNU C++
- @cindex misunderstandings in C++
- @cindex surprises in C++
- @cindex C++ misunderstandings
- C++ is a complex language and an evolving one, and its standard
- definition (the ISO C++ standard) was only recently completed. As a
- result, your C++ compiler may occasionally surprise you, even when its
- behavior is correct. This section discusses some areas that frequently
- give rise to questions of this sort.
- @menu
- * Static Definitions:: Static member declarations are not definitions
- * Name lookup:: Name lookup, templates, and accessing members of base classes
- * Temporaries:: Temporaries may vanish before you expect
- * Copy Assignment:: Copy Assignment operators copy virtual bases twice
- @end menu
- @node Static Definitions
- @subsection Declare @emph{and} Define Static Members
- @cindex C++ static data, declaring and defining
- @cindex static data in C++, declaring and defining
- @cindex declaring static data in C++
- @cindex defining static data in C++
- When a class has static data members, it is not enough to @emph{declare}
- the static member; you must also @emph{define} it. For example:
- @smallexample
- class Foo
- @{
- @dots{}
- void method();
- static int bar;
- @};
- @end smallexample
- This declaration only establishes that the class @code{Foo} has an
- @code{int} named @code{Foo::bar}, and a member function named
- @code{Foo::method}. But you still need to define @emph{both}
- @code{method} and @code{bar} elsewhere. According to the ISO
- standard, you must supply an initializer in one (and only one) source
- file, such as:
- @smallexample
- int Foo::bar = 0;
- @end smallexample
- Other C++ compilers may not correctly implement the standard behavior.
- As a result, when you switch to @command{g++} from one of these compilers,
- you may discover that a program that appeared to work correctly in fact
- does not conform to the standard: @command{g++} reports as undefined
- symbols any static data members that lack definitions.
- @node Name lookup
- @subsection Name Lookup, Templates, and Accessing Members of Base Classes
- @cindex base class members
- @cindex two-stage name lookup
- @cindex dependent name lookup
- The C++ standard prescribes that all names that are not dependent on
- template parameters are bound to their present definitions when parsing
- a template function or class.@footnote{The C++ standard just uses the
- term ``dependent'' for names that depend on the type or value of
- template parameters. This shorter term will also be used in the rest of
- this section.} Only names that are dependent are looked up at the point
- of instantiation. For example, consider
- @smallexample
- void foo(double);
- struct A @{
- template <typename T>
- void f () @{
- foo (1); // @r{1}
- int i = N; // @r{2}
- T t;
- t.bar(); // @r{3}
- foo (t); // @r{4}
- @}
- static const int N;
- @};
- @end smallexample
- Here, the names @code{foo} and @code{N} appear in a context that does
- not depend on the type of @code{T}. The compiler will thus require that
- they are defined in the context of use in the template, not only before
- the point of instantiation, and will here use @code{::foo(double)} and
- @code{A::N}, respectively. In particular, it will convert the integer
- value to a @code{double} when passing it to @code{::foo(double)}.
- Conversely, @code{bar} and the call to @code{foo} in the fourth marked
- line are used in contexts that do depend on the type of @code{T}, so
- they are only looked up at the point of instantiation, and you can
- provide declarations for them after declaring the template, but before
- instantiating it. In particular, if you instantiate @code{A::f<int>},
- the last line will call an overloaded @code{::foo(int)} if one was
- provided, even if after the declaration of @code{struct A}.
- This distinction between lookup of dependent and non-dependent names is
- called two-stage (or dependent) name lookup. G++ implements it
- since version 3.4.
- Two-stage name lookup sometimes leads to situations with behavior
- different from non-template codes. The most common is probably this:
- @smallexample
- template <typename T> struct Base @{
- int i;
- @};
- template <typename T> struct Derived : public Base<T> @{
- int get_i() @{ return i; @}
- @};
- @end smallexample
- In @code{get_i()}, @code{i} is not used in a dependent context, so the
- compiler will look for a name declared at the enclosing namespace scope
- (which is the global scope here). It will not look into the base class,
- since that is dependent and you may declare specializations of
- @code{Base} even after declaring @code{Derived}, so the compiler can't
- really know what @code{i} would refer to. If there is no global
- variable @code{i}, then you will get an error message.
- In order to make it clear that you want the member of the base class,
- you need to defer lookup until instantiation time, at which the base
- class is known. For this, you need to access @code{i} in a dependent
- context, by either using @code{this->i} (remember that @code{this} is of
- type @code{Derived<T>*}, so is obviously dependent), or using
- @code{Base<T>::i}. Alternatively, @code{Base<T>::i} might be brought
- into scope by a @code{using}-declaration.
- Another, similar example involves calling member functions of a base
- class:
- @smallexample
- template <typename T> struct Base @{
- int f();
- @};
- template <typename T> struct Derived : Base<T> @{
- int g() @{ return f(); @};
- @};
- @end smallexample
- Again, the call to @code{f()} is not dependent on template arguments
- (there are no arguments that depend on the type @code{T}, and it is also
- not otherwise specified that the call should be in a dependent context).
- Thus a global declaration of such a function must be available, since
- the one in the base class is not visible until instantiation time. The
- compiler will consequently produce the following error message:
- @smallexample
- x.cc: In member function `int Derived<T>::g()':
- x.cc:6: error: there are no arguments to `f' that depend on a template
- parameter, so a declaration of `f' must be available
- x.cc:6: error: (if you use `-fpermissive', G++ will accept your code, but
- allowing the use of an undeclared name is deprecated)
- @end smallexample
- To make the code valid either use @code{this->f()}, or
- @code{Base<T>::f()}. Using the @option{-fpermissive} flag will also let
- the compiler accept the code, by marking all function calls for which no
- declaration is visible at the time of definition of the template for
- later lookup at instantiation time, as if it were a dependent call.
- We do not recommend using @option{-fpermissive} to work around invalid
- code, and it will also only catch cases where functions in base classes
- are called, not where variables in base classes are used (as in the
- example above).
- Note that some compilers (including G++ versions prior to 3.4) get these
- examples wrong and accept above code without an error. Those compilers
- do not implement two-stage name lookup correctly.
- @node Temporaries
- @subsection Temporaries May Vanish Before You Expect
- @cindex temporaries, lifetime of
- @cindex portions of temporary objects, pointers to
- It is dangerous to use pointers or references to @emph{portions} of a
- temporary object. The compiler may very well delete the object before
- you expect it to, leaving a pointer to garbage. The most common place
- where this problem crops up is in classes like string classes,
- especially ones that define a conversion function to type @code{char *}
- or @code{const char *}---which is one reason why the standard
- @code{string} class requires you to call the @code{c_str} member
- function. However, any class that returns a pointer to some internal
- structure is potentially subject to this problem.
- For example, a program may use a function @code{strfunc} that returns
- @code{string} objects, and another function @code{charfunc} that
- operates on pointers to @code{char}:
- @smallexample
- string strfunc ();
- void charfunc (const char *);
- void
- f ()
- @{
- const char *p = strfunc().c_str();
- @dots{}
- charfunc (p);
- @dots{}
- charfunc (p);
- @}
- @end smallexample
- @noindent
- In this situation, it may seem reasonable to save a pointer to the C
- string returned by the @code{c_str} member function and use that rather
- than call @code{c_str} repeatedly. However, the temporary string
- created by the call to @code{strfunc} is destroyed after @code{p} is
- initialized, at which point @code{p} is left pointing to freed memory.
- Code like this may run successfully under some other compilers,
- particularly obsolete cfront-based compilers that delete temporaries
- along with normal local variables. However, the GNU C++ behavior is
- standard-conforming, so if your program depends on late destruction of
- temporaries it is not portable.
- The safe way to write such code is to give the temporary a name, which
- forces it to remain until the end of the scope of the name. For
- example:
- @smallexample
- const string& tmp = strfunc ();
- charfunc (tmp.c_str ());
- @end smallexample
- @node Copy Assignment
- @subsection Implicit Copy-Assignment for Virtual Bases
- When a base class is virtual, only one subobject of the base class
- belongs to each full object. Also, the constructors and destructors are
- invoked only once, and called from the most-derived class. However, such
- objects behave unspecified when being assigned. For example:
- @smallexample
- struct Base@{
- char *name;
- Base(char *n) : name(strdup(n))@{@}
- Base& operator= (const Base& other)@{
- free (name);
- name = strdup (other.name);
- @}
- @};
- struct A:virtual Base@{
- int val;
- A():Base("A")@{@}
- @};
- struct B:virtual Base@{
- int bval;
- B():Base("B")@{@}
- @};
- struct Derived:public A, public B@{
- Derived():Base("Derived")@{@}
- @};
- void func(Derived &d1, Derived &d2)
- @{
- d1 = d2;
- @}
- @end smallexample
- The C++ standard specifies that @samp{Base::Base} is only called once
- when constructing or copy-constructing a Derived object. It is
- unspecified whether @samp{Base::operator=} is called more than once when
- the implicit copy-assignment for Derived objects is invoked (as it is
- inside @samp{func} in the example).
- G++ implements the ``intuitive'' algorithm for copy-assignment: assign all
- direct bases, then assign all members. In that algorithm, the virtual
- base subobject can be encountered more than once. In the example, copying
- proceeds in the following order: @samp{val}, @samp{name} (via
- @code{strdup}), @samp{bval}, and @samp{name} again.
- If application code relies on copy-assignment, a user-defined
- copy-assignment operator removes any uncertainties. With such an
- operator, the application can define whether and how the virtual base
- subobject is assigned.
- @node Non-bugs
- @section Certain Changes We Don't Want to Make
- This section lists changes that people frequently request, but which
- we do not make because we think GCC is better without them.
- @itemize @bullet
- @item
- Checking the number and type of arguments to a function which has an
- old-fashioned definition and no prototype.
- Such a feature would work only occasionally---only for calls that appear
- in the same file as the called function, following the definition. The
- only way to check all calls reliably is to add a prototype for the
- function. But adding a prototype eliminates the motivation for this
- feature. So the feature is not worthwhile.
- @item
- Warning about using an expression whose type is signed as a shift count.
- Shift count operands are probably signed more often than unsigned.
- Warning about this would cause far more annoyance than good.
- @item
- Warning about assigning a signed value to an unsigned variable.
- Such assignments must be very common; warning about them would cause
- more annoyance than good.
- @item
- Warning when a non-void function value is ignored.
- C contains many standard functions that return a value that most
- programs choose to ignore. One obvious example is @code{printf}.
- Warning about this practice only leads the defensive programmer to
- clutter programs with dozens of casts to @code{void}. Such casts are
- required so frequently that they become visual noise. Writing those
- casts becomes so automatic that they no longer convey useful
- information about the intentions of the programmer. For functions
- where the return value should never be ignored, use the
- @code{warn_unused_result} function attribute (@pxref{Function
- Attributes}).
- @item
- @opindex fshort-enums
- Making @option{-fshort-enums} the default.
- This would cause storage layout to be incompatible with most other C
- compilers. And it doesn't seem very important, given that you can get
- the same result in other ways. The case where it matters most is when
- the enumeration-valued object is inside a structure, and in that case
- you can specify a field width explicitly.
- @item
- Making bit-fields unsigned by default on particular machines where ``the
- ABI standard'' says to do so.
- The ISO C standard leaves it up to the implementation whether a bit-field
- declared plain @code{int} is signed or not. This in effect creates two
- alternative dialects of C@.
- @opindex fsigned-bitfields
- @opindex funsigned-bitfields
- The GNU C compiler supports both dialects; you can specify the signed
- dialect with @option{-fsigned-bitfields} and the unsigned dialect with
- @option{-funsigned-bitfields}. However, this leaves open the question of
- which dialect to use by default.
- Currently, the preferred dialect makes plain bit-fields signed, because
- this is simplest. Since @code{int} is the same as @code{signed int} in
- every other context, it is cleanest for them to be the same in bit-fields
- as well.
- Some computer manufacturers have published Application Binary Interface
- standards which specify that plain bit-fields should be unsigned. It is
- a mistake, however, to say anything about this issue in an ABI@. This is
- because the handling of plain bit-fields distinguishes two dialects of C@.
- Both dialects are meaningful on every type of machine. Whether a
- particular object file was compiled using signed bit-fields or unsigned
- is of no concern to other object files, even if they access the same
- bit-fields in the same data structures.
- A given program is written in one or the other of these two dialects.
- The program stands a chance to work on most any machine if it is
- compiled with the proper dialect. It is unlikely to work at all if
- compiled with the wrong dialect.
- Many users appreciate the GNU C compiler because it provides an
- environment that is uniform across machines. These users would be
- inconvenienced if the compiler treated plain bit-fields differently on
- certain machines.
- Occasionally users write programs intended only for a particular machine
- type. On these occasions, the users would benefit if the GNU C compiler
- were to support by default the same dialect as the other compilers on
- that machine. But such applications are rare. And users writing a
- program to run on more than one type of machine cannot possibly benefit
- from this kind of compatibility.
- This is why GCC does and will treat plain bit-fields in the same
- fashion on all types of machines (by default).
- There are some arguments for making bit-fields unsigned by default on all
- machines. If, for example, this becomes a universal de facto standard,
- it would make sense for GCC to go along with it. This is something
- to be considered in the future.
- (Of course, users strongly concerned about portability should indicate
- explicitly in each bit-field whether it is signed or not. In this way,
- they write programs which have the same meaning in both C dialects.)
- @item
- @opindex ansi
- @opindex std
- Undefining @code{__STDC__} when @option{-ansi} is not used.
- Currently, GCC defines @code{__STDC__} unconditionally. This provides
- good results in practice.
- Programmers normally use conditionals on @code{__STDC__} to ask whether
- it is safe to use certain features of ISO C, such as function
- prototypes or ISO token concatenation. Since plain @command{gcc} supports
- all the features of ISO C, the correct answer to these questions is
- ``yes''.
- Some users try to use @code{__STDC__} to check for the availability of
- certain library facilities. This is actually incorrect usage in an ISO
- C program, because the ISO C standard says that a conforming
- freestanding implementation should define @code{__STDC__} even though it
- does not have the library facilities. @samp{gcc -ansi -pedantic} is a
- conforming freestanding implementation, and it is therefore required to
- define @code{__STDC__}, even though it does not come with an ISO C
- library.
- Sometimes people say that defining @code{__STDC__} in a compiler that
- does not completely conform to the ISO C standard somehow violates the
- standard. This is illogical. The standard is a standard for compilers
- that claim to support ISO C, such as @samp{gcc -ansi}---not for other
- compilers such as plain @command{gcc}. Whatever the ISO C standard says
- is relevant to the design of plain @command{gcc} without @option{-ansi} only
- for pragmatic reasons, not as a requirement.
- GCC normally defines @code{__STDC__} to be 1, and in addition
- defines @code{__STRICT_ANSI__} if you specify the @option{-ansi} option,
- or a @option{-std} option for strict conformance to some version of ISO C@.
- On some hosts, system include files use a different convention, where
- @code{__STDC__} is normally 0, but is 1 if the user specifies strict
- conformance to the C Standard. GCC follows the host convention when
- processing system include files, but when processing user files it follows
- the usual GNU C convention.
- @item
- Undefining @code{__STDC__} in C++.
- Programs written to compile with C++-to-C translators get the
- value of @code{__STDC__} that goes with the C compiler that is
- subsequently used. These programs must test @code{__STDC__}
- to determine what kind of C preprocessor that compiler uses:
- whether they should concatenate tokens in the ISO C fashion
- or in the traditional fashion.
- These programs work properly with GNU C++ if @code{__STDC__} is defined.
- They would not work otherwise.
- In addition, many header files are written to provide prototypes in ISO
- C but not in traditional C@. Many of these header files can work without
- change in C++ provided @code{__STDC__} is defined. If @code{__STDC__}
- is not defined, they will all fail, and will all need to be changed to
- test explicitly for C++ as well.
- @item
- Deleting ``empty'' loops.
- Historically, GCC has not deleted ``empty'' loops under the
- assumption that the most likely reason you would put one in a program is
- to have a delay, so deleting them will not make real programs run any
- faster.
- However, the rationale here is that optimization of a nonempty loop
- cannot produce an empty one. This held for carefully written C compiled
- with less powerful optimizers but is not always the case for carefully
- written C++ or with more powerful optimizers.
- Thus GCC will remove operations from loops whenever it can determine
- those operations are not externally visible (apart from the time taken
- to execute them, of course). In case the loop can be proved to be finite,
- GCC will also remove the loop itself.
- Be aware of this when performing timing tests, for instance the
- following loop can be completely removed, provided
- @code{some_expression} can provably not change any global state.
- @smallexample
- @{
- int sum = 0;
- int ix;
- for (ix = 0; ix != 10000; ix++)
- sum += some_expression;
- @}
- @end smallexample
- Even though @code{sum} is accumulated in the loop, no use is made of
- that summation, so the accumulation can be removed.
- @item
- Making side effects happen in the same order as in some other compiler.
- @cindex side effects, order of evaluation
- @cindex order of evaluation, side effects
- It is never safe to depend on the order of evaluation of side effects.
- For example, a function call like this may very well behave differently
- from one compiler to another:
- @smallexample
- void func (int, int);
- int i = 2;
- func (i++, i++);
- @end smallexample
- There is no guarantee (in either the C or the C++ standard language
- definitions) that the increments will be evaluated in any particular
- order. Either increment might happen first. @code{func} might get the
- arguments @samp{2, 3}, or it might get @samp{3, 2}, or even @samp{2, 2}.
- @item
- Making certain warnings into errors by default.
- Some ISO C testsuites report failure when the compiler does not produce
- an error message for a certain program.
- @opindex pedantic-errors
- ISO C requires a ``diagnostic'' message for certain kinds of invalid
- programs, but a warning is defined by GCC to count as a diagnostic. If
- GCC produces a warning but not an error, that is correct ISO C support.
- If testsuites call this ``failure'', they should be run with the GCC
- option @option{-pedantic-errors}, which will turn these warnings into
- errors.
- @end itemize
- @node Warnings and Errors
- @section Warning Messages and Error Messages
- @cindex error messages
- @cindex warnings vs errors
- @cindex messages, warning and error
- The GNU compiler can produce two kinds of diagnostics: errors and
- warnings. Each kind has a different purpose:
- @itemize @w{}
- @item
- @dfn{Errors} report problems that make it impossible to compile your
- program. GCC reports errors with the source file name and line
- number where the problem is apparent.
- @item
- @dfn{Warnings} report other unusual conditions in your code that
- @emph{may} indicate a problem, although compilation can (and does)
- proceed. Warning messages also report the source file name and line
- number, but include the text @samp{warning:} to distinguish them
- from error messages.
- @end itemize
- Warnings may indicate danger points where you should check to make sure
- that your program really does what you intend; or the use of obsolete
- features; or the use of nonstandard features of GNU C or C++. Many
- warnings are issued only if you ask for them, with one of the @option{-W}
- options (for instance, @option{-Wall} requests a variety of useful
- warnings).
- @opindex pedantic
- @opindex pedantic-errors
- GCC always tries to compile your program if possible; it never
- gratuitously rejects a program whose meaning is clear merely because
- (for instance) it fails to conform to a standard. In some cases,
- however, the C and C++ standards specify that certain extensions are
- forbidden, and a diagnostic @emph{must} be issued by a conforming
- compiler. The @option{-pedantic} option tells GCC to issue warnings in
- such cases; @option{-pedantic-errors} says to make them errors instead.
- This does not mean that @emph{all} non-ISO constructs get warnings
- or errors.
- @xref{Warning Options,,Options to Request or Suppress Warnings}, for
- more detail on these and related command-line options.
|