


G++(1)                      GNU Tools                      G++(1)



NAME
     g++ - GNU project C++ Compiler (v2 preliminary)

SYNOPSIS
     g++ [_o_p_t_i_o_n | _f_i_l_e_n_a_m_e ]...

DESCRIPTION
     The C and C++ compilers are integrated.  Both process  input
     files  through  one  or  more of four stages: preprocessing,
     compilation, assembly, and linking.  This man page  contains
     full  descriptions for _o_n_l_y C++ specific aspects of the com-
     piler, though it also contains summaries  of  some  general-
     purpose  options.  For a fuller explanation of the compiler,
     see gcc(1).

     C++ source files use one of the  suffixes  `.C',  `.cc',  or
     `.cxx'.

OPTIONS
     There are many command-line options,  including  options  to
     control  details of optimization, warnings, and code genera-
     tion, which are common to both gcc and g++.  For full infor-
     mation on all options, see gcc(1).

     Options must be separate: `-dr' is quite different from  `-d
     -r '.

     Most `-f' and `-W' options have two contrary  forms:  -f_n_a_m_e
     and  -fno-_n_a_m_e  (or  -W_n_a_m_e  and  -Wno-_n_a_m_e).  Only the non-
     default forms are shown here.


     -c   Compile or assemble the source files, but do not  link.
          The  compiler output is an object file corresponding to
          each source file.

     -D_m_a_c_r_o
          Define macro _m_a_c_r_o with the string `1' as  its  defini-
          tion.

     -D_m_a_c_r_o=_d_e_f_n
          Define macro _m_a_c_r_o as _d_e_f_n.

     -E   Stop after the preprocessing stage; do not run the com-
          piler  proper.  The output is preprocessed source code,
          which is sent to the standard output.

     +e_N  control whether virtual function definitions in classes
          are used to generate code, or only to define interfaces
          for their callers.  These options are provided for com-
          patibility  with  cfront 1.x usage; the recommended GNU
          C++ usage is  to  use  #pragma  interface  and  #pragma



GNU Tools            Last change: 27dec1991                     1






G++(1)                      GNU Tools                      G++(1)



          implementation, instead.

          With `+e0', virtual function definitions in classes are
          declared  extern;  the  declaration  is used only as an
          interface specification, not to generate code  for  the
          virtual functions (in this compilation).

          With `+e1', g++ actually generates the code  implement-
          ing  virtual  functions  defined in the code, and makes
          them publicly visible.

     -fall-virtual
          When you use the `-fall-virtual', all member  functions
          (except for constructor functions and new/delete member
          operators) declared in the same class with a  ``method-
          call'' operator method are treated as virtual functions
          of the given class.  In effect, all  of  these  methods
          become ``implicitly virtual.''

          This does _n_o_t mean that all calls to these methods will
          be  made  through  the  internal table of virtual func-
          tions.  There are some circumstances under which it  is
          obvious  that a call to a given virtual function can be
          made directly, and in these cases the  calls  still  go
          direct.

          The effect of making all methods  of  a  class  with  a
          declared   `operator->()()'  implicitly  virtual  using
          `-fall-virtual' extends  also  to  all  non-constructor
          methods of any class derived from such a class.

     -fdollars-in-identifiers
          Permit the use of `$' in  identifiers.   Traditional  C
          allowed  the character `$' to form part of identifiers;
          by default, GNU C also allows this.   However,  ANSI  C
          forbids `$' in identifiers, and GNU C++ also forbids it
          by default on most platforms (though on some  platforms
          it's enabled by default for GNU C++ as well).

     -felide-constructors
          Use this option to instruct the compiler to be  smarter
          about  when  it  can  elide constructors.  Without this
          flag, GNU C++ and cfront both generate effectively  the
          same code for:

          A foo ();
          A x (foo ());   // x initialized by `foo ()', no ctor called
          A y = foo ();   // call to `foo ()' heads to temporary,
                          // y is initialized from the temporary.

          Note the difference!  With this flag, GNU C++  initial-
          izes `y' directly from the call to foo () without going



GNU Tools            Last change: 27dec1991                     2






G++(1)                      GNU Tools                      G++(1)



          through a temporary.

     -fenum-int-equiv
          Normally GNU C++ allows conversion of enum to int,  but
          not  the other way around.  Use this option if you want
          GNU C++ to allow conversion of int to enum as well.

     -fgnu-binutils

     -fno-gnu-binutils
          `-fgnu-binutils ' (the default for most, but  not  all,
          platforms)  makes  GNU  C++  emit extra information for
          static initialization and finalization.  This  informa-
          tion  has  to  be  passed from the assembler to the GNU
          linker.  Some assemblers won't pass  this  information;
          you  must  either  use  GNU  as  or  specify the option
          `-fno-gnu-binutils'.

          With `-fno-gnu-binutils', you must use the program col-
          lect (part of the GCC distribution) for linking.

     -fmemoize-lookups

     -fsave-memoized
          These flags are used to get  the  compiler  to  compile
          programs  faster  using heuristics.  They are not on by
          default since they are only effective  about  half  the
          time.  The other half of the time programs compile more
          slowly (and take more memory).

          The first time the compiler must  build  a  call  to  a
          member  function  (or  reference  to a data member), it
          must (1) determine whether the class implements  member
          functions  of that name; (2) resolve which member func-
          tion to call (which involves figuring out what sorts of
          type  conversions  need  to be made); and (3) check the
          visibility of the member function to the  caller.   All
          of  this  adds up to slower compilation.  Normally, the
          second time a call is made to that member function  (or
          reference  to that data member), it must go through the
          same lengthy process again.  This means that code  like
          this

            cout << "This " << p << " has " << n << " legs.\n";

          makes six passes through all three steps.  By  using  a
          software  cache,  a  ``hit'' significantly reduces this
          cost.   Unfortunately,  using  the   cache   introduces
          another  layer of mechanisms which must be implemented,
          and so incurs its  own  overhead.   `-fmemoize-lookups'
          enables the software cache.




GNU Tools            Last change: 27dec1991                     3






G++(1)                      GNU Tools                      G++(1)



          Because access privileges (visibility) to  members  and
          member  functions  may differ from one function context
          to the next, g++ may need to flush the cache. With  the
          `-fmemoize-lookups'  flag,  the  cache is flushed after
          every function that is compiled.  The `-fsave-memoized'
          flag enables the same software cache, but when the com-
          piler determines that the context of the last  function
          compiled  would yield the same access privileges of the
          next function to compile, it preserves the cache.  This
          is most helpful when defining many member functions for
          the same class: with the exception of member  functions
          which  are  friends of other classes, each member func-
          tion has exactly the same access  privileges  as  every
          other, and the cache need not be flushed.

     -fno-default-inline
          If `-fdefault-inline' is enabled then member  functions
          defined  inside  class  scope  are  compiled  inline by
          default; i.e., you don't need to add `inline' in  front
          of  the  member function name.  By popular demand, this
          option is now the default.  To keep GNU C++ from inlin-
          ing      these      member      functions,      specify
          `-fno-default-inline'.

     -fno-strict-prototype
          Consider the declaration int foo  ();.   In  C++,  this
          means  that  the  function  foo takes no arguments.  In
          ANSI C, this is declared int foo(void);.  With the flag
          `-fno-strict-prototype',  declaring  functions  with no
          arguments is equivalent to declaring its argument  list
          to  be untyped, i.e., int foo (); is equivalent to say-
          ing int foo (...);.

     -fnonnull-objects
          Normally, GNU C++ makes conservative assumptions  about
          objects  reached  through references.  For example, the
          compiler must check that `a' is not null in  code  like
          the following:
              obj &a = g ();
              a.f (2);
          Checking that references of  this  sort  have  non-null
          values requires extra code, however, and it is unneces-
          sary    for    many    programs.     You    can     use
          `-fnonnull-objects'  to  omit  the  checks for null, if
          your program doesn't require the default checking.

     -fthis-is-variable
          The incorporation of user-defined free store management
          into  C++  has  made assignment to this an anachronism.
          Therefore, by default GNU C++ treats the type  of  this
          in  a  member  function  of class X to be X *const.  In
          other words, it is illegal to assign to this  within  a



GNU Tools            Last change: 27dec1991                     4






G++(1)                      GNU Tools                      G++(1)



          class member function.  However, for backwards compati-
          bility, you  can  invoke  the  old  behavior  by  using
          `-fthis-is-variable'.

     -g   Produce debugging information in the operating system's
          native  format (for DBX or SDB or DWARF).  GDB also can
          work with this debugging information.  On most  systems
          that  use  DBX format, `-g' enables use of extra debug-
          ging information that only GDB can use.

          Unlike most other C compilers, GNU CC allows you to use
          `-g'  with `-O'.  The shortcuts taken by optimized code
          may occasionally produce surprising results: some vari-
          ables  you  declared may not exist at all; flow of con-
          trol may briefly move where you did not expect it; some
          statements  may  not  be  executed because they compute
          constant results or their values were already at  hand;
          some statements may execute in different places because
          they were moved out of loops.

          Nevertheless it proves possible to debug optimized out-
          put.  This makes it reasonable to use the optimizer for
          programs that might have bugs.

     -I_d_i_r
           Append  directory  _d_i_r  to  the  list  of  directories
          searched for include files.

     -L_d_i_r
           Add directory _d_i_r to the list  of  directories  to  be
          searched for `-l'.

     -l_l_i_b_r_a_r_y
           Use the library named _l_i_b_r_a_r_y when linking.  (C++ pro-
          grams often require `-lg++' for successful linking.)

     -O   Optimize.  Optimizing compilation takes  somewhat  more
          time, and a lot more memory for a large function.

          Without `-O', the compiler's goal is to reduce the cost
          of  compilation  and  to  make  debugging  produce  the
          expected results.  Statements are independent:  if  you
          stop  the program with a breakpoint between statements,
          you can then assign a new  value  to  any  variable  or
          change  the  program  counter to any other statement in
          the function and get  exactly  the  results  you  would
          expect from the source code.

          Without `-O',  only  variables  declared  register  are
          allocated in registers.  The resulting compiled code is
          a little worse than produced by PCC without `-O'.




GNU Tools            Last change: 27dec1991                     5






G++(1)                      GNU Tools                      G++(1)



          With `-O', the compiler tries to reduce code  size  and
          execution time.

     -o _f_i_l_e
           Place output in file _f_i_l_e.

     -S   Stop after the stage  of  compilation  proper;  do  not
          assemble.   The  output  is  an assembler code file for
          each non-assembler input file specified.

     -static
          On systems that support dynamic linking, this  prevents
          linking with the shared libraries.  (`-g' also has this
          effect.)  On other systems, this option has no effect.

     -traditional
          Attempt to support some aspects of traditional  C  com-
          pilers.

          Specifically, for both C and C++ programs:

        o+ In the preprocessor, comments  convert  to  nothing  at
          all,  rather  than to a space.  This allows traditional
          token concatenation.

        o+ In the preprocessor,  macro  arguments  are  recognized
          within  string  constants  in  a  macro definition (and
          their values are stringified, though without additional
          quote  marks, when they appear in such a context).  The
          preprocessor always considers a string constant to  end
          at a newline.

        o+ The preprocessor does not predefine the macro  __STDC__
          when     you     use    `-traditional',    but    still
          predefines__GNUC__ (since the GNU extensions  indicated
          by  __GNUC__  are  not affected by `-traditional').  If
          you need to write header files  that  work  differently
          depending on whether `-traditional' is in use, by test-
          ing both of these predefined macros you can distinguish
          four situations: GNU C, traditional GNU C, other ANSI C
          compilers, and other old C compilers.

        o+ In the preprocessor, comments  convert  to  nothing  at
          all,  rather  than to a space.  This allows traditional
          token concatenation.

        o+ In the preprocessor,  macro  arguments  are  recognized
          within  string  constants  in  a  macro definition (and
          their values are stringified, though without additional
          quote  marks, when they appear in such a context).  The
          preprocessor always considers a string constant to  end
          at a newline.



GNU Tools            Last change: 27dec1991                     6






G++(1)                      GNU Tools                      G++(1)



        o+ The preprocessor does not predefine the macro  __STDC__
          when     you     use    `-traditional',    but    still
          predefines__GNUC__ (since the GNU extensions  indicated
          by  __GNUC__  are  not affected by `-traditional').  If
          you need to write header files  that  work  differently
          depending on whether `-traditional' is in use, by test-
          ing both of these predefined macros you can distinguish
          four situations: GNU C, traditional GNU C, other ANSI C
          compilers, and other old C compilers.

        o+ String ``constants'' are not necessarily constant; they
          are  stored  in  writable  space, and identical looking
          constants are allocated separately.  (This is the  same
          as the effect of `-fwritable-strings'.)

          For C++ programs only (not C), `-traditional'  has  one
          additional  effect:  assignment  to  this is permitted.
          This is the same as the effect of `-fthis-is-variable'.

     -U_m_a_c_r_o
          Undefine macro _m_a_c_r_o.

     -Wall
          Issue warnings for conditions which  pertain  to  usage
          that  we recommend avoiding and that we believe is easy
          to avoid, even in conjunction with macros.

     -Wenum-clash
          Warn  when  converting  between  different  enumeration
          types.

     -Woverloaded-virtual
          In a derived class, the definitions  of  virtual  func-
          tions  must match the type signature of a virtual func-
          tion declared in the base class.  Use  this  option  to
          request  warnings when a derived class declares a func-
          tion that may be an erroneous attempt to define a  vir-
          tual  function:  that is, warn when a function with the
          same name as a virtual function in the base class,  but
          with  a  type  signature that doesn't match any virtual
          functions from the base class.

     -w   Inhibit all warning messages.

PRAGMAS
     Two `#pragma' directives are supported for GNU C++, to  per-
     mit using the same header file for two purposes: as a defin-
     ition of interfaces to a given object class, and as the full
     definition of the contents of that object class.

     #pragma interface
          Use this directive in header files that  define  object



GNU Tools            Last change: 27dec1991                     7






G++(1)                      GNU Tools                      G++(1)



          classes, to save space in most of the object files that
          use those classes.  Normally, local copies  of  certain
          information  (backup copies of inline member functions,
          debugging information, and  the  internal  tables  that
          implement  virtual  functions)  must  be  kept  in each
          object file that includes class definitions.   You  can
          use  this  pragma  to  avoid  such duplication.  When a
          header file containing `#pragma interface' is  included
          in  a  compilation, this auxiliary information will not
          be generated (unless the main input source file  itself
          uses  `#pragma  implementation').   Instead, the object
          files will contain references to be  resolved  at  link
          time.

     #pragma implementation

     #pragma implementation "_o_b_j_e_c_t_s.h"
          Use this pragma in a main input  file,  when  you  want
          full  output from included header files to be generated
          (and made globally visible).  The included header file,
          in  turn, should use `#pragma interface'. Backup copies
          of inline member functions, debugging information,  and
          the internal tables used to implement virtual functions
          are all generated in implementation files.

          If you use `#pragma implementation' with  no  argument,
          it applies to an include file with the same basename as
          your  source  file;  for  example,  in   `allclass.cc',
          `#pragma  implementation'  by  itself  is equivalent to
          `#pragma implementation "allclass.h"'.  Use the  string
          argument  if  you  want a single implementation file to
          include code from multiple header files.

          There is no way to split up the contents  of  a  single
          header file into multiple implementation files.

FILES
     file.h             C header (preprocessor) file
     file.i             preprocessed C source file
     file.C             C++ source file
     file.cc            C++ source file
     file.cxx           C++ source file
     file.s             assembly language file
     file.o             object file
     a.out              link edited output
     _T_M_P_D_I_R/cc*         temporary files
     _L_I_B_D_I_R/cpp         preprocessor
     _L_I_B_D_I_R/cc1plus     compiler
     _L_I_B_D_I_R/collect     linker front end needed on some machines
     _L_I_B_D_I_R/libgcc.a    GCC subroutine library
     /lib/crt[01n].o    start-up routine
     _L_I_B_D_I_R/ccrt0       additional start-up routine for C++



GNU Tools            Last change: 27dec1991                     8






G++(1)                      GNU Tools                      G++(1)



     /lib/libc.a        standard C library, see _i_n_t_r_o(3)
     /usr/include       standard directory for #include files
     _L_I_B_D_I_R/include     standard gcc directory for #include files
     _L_I_B_D_I_R/g++-include additional g++ directory for #include

     _L_I_B_D_I_R is usually /usr/local/lib/_m_a_c_h_i_n_e/_v_e_r_s_i_o_n.
     _T_M_P_D_I_R comes from the environment variable  TMPDIR  (default
     /usr/tmp if available, else /tmp).

SEE ALSO
     gcc(1),  cpp(1),  as(1),  ld(1),  gdb(1),  adb(1),   dbx(1),
     sdb(1).
     `gcc', `cpp', `as',`ld', and `gdb' entries in info.
     _U_s_i_n_g _a_n_d _P_o_r_t_i_n_g _G_N_U  _C_C  (_f_o_r  _v_e_r_s_i_o_n  _2._0),  Richard  M.
     Stallman,  November  1990;  _T_h_e  _C  _P_r_e_p_r_o_c_e_s_s_o_r, Richard M.
     Stallman, July 1990; _U_s_i_n_g _G_D_B: _A _G_u_i_d_e _t_o _t_h_e  _G_N_U  _S_o_u_r_c_e-
     _L_e_v_e_l  _D_e_b_u_g_g_e_r,  Richard  M.  Stallman and Roland H. Pesch,
     December 1991; _U_s_i_n_g _a_s: _t_h_e _G_N_U _A_s_s_e_m_b_l_e_r, Dean Elsner, Jay
     Fenlason  &  friends, March 1991; _g_l_d: _t_h_e _G_N_U _l_i_n_k_e_r, Steve
     Chamberlain and Roland Pesch, April 1991.


BUGS
     Report bugs to bug-gcc@prep.ai.mit.edu.  Bugs tend  actually
     to  be  fixed  if  they  can  be  isolated, so it is in your
     interest to report them in such  a  way  that  they  can  be
     easily reproduced.

COPYING
     Copyright (c) 1991 Free Software Foundation, Inc.

     Permission is granted to make and distribute verbatim copies
     of  this  manual provided the copyright notice and this per-
     mission notice are preserved on all copies.

     Permission is granted to copy and distribute  modified  ver-
     sions of this manual under the conditions for verbatim copy-
     ing, provided that the entire resulting derived work is dis-
     tributed under the terms of a permission notice identical to
     this one.

     Permission is granted to copy and distribute translations of
     this  manual  into  another language, under the above condi-
     tions for modified versions,  except  that  this  permission
     notice  may be included in translations approved by the Free
     Software Foundation instead of in the original English.

AUTHORS
     See the GNU CC Manual for the contributors to GNU CC.






GNU Tools            Last change: 27dec1991                     9



