home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-02-05 | 19.5 KB | 690 lines | [TEXT/MPS ] |
- .\" Copyright (c) 1991 Free Software Foundation -*-Text-*-
- .\" See section COPYING for conditions for redistribution
- .\" FIXME: no info here on predefines. Should there be? extra for C++...
- .TH G++ 1 "27dec1991" "GNU Tools" "GNU Tools"
- .de BP
- .sp
- .ti \-.2i
- \(**
- ..
- .SH NAME
- g++ \- GNU project C++ Compiler (v2 preliminary)
- .SH SYNOPSIS
- .RB g++ " [" \c
- .IR option " | " filename " ].\|.\|.
- .SH DESCRIPTION
- The C and C++ compilers are integrated;
- .B g++
- is a script to call
- .B gcc with options to recognize C++.
- .B gcc
- processes input files
- through one or more of four stages: preprocessing, compilation,
- assembly, and linking. This man page contains full descriptions for
- .I only
- C++ specific aspects of the compiler, though it also contains
- summaries of some general-purpose options. For a fuller explanation
- of the compiler, see
- .BR gcc ( 1 ).
-
- C++ source files use one of the suffixes `\|\c
- .B .C\c
- \&\|', `\|\c
- .B .cc\c
- \&\|', or `\|\c
- .B .cxx\c
- \&\|'; preprocessed C++ files use the suffix `\|\c
- .B .ii\c
- \&\|'.
- .SH OPTIONS
- There are many command-line options, including options to control
- details of optimization, warnings, and code generation, which are
- common to both
- .B gcc
- and
- .B g++\c
- \&. For full information on all options, see
- .BR gcc ( 1 ).
-
- Options must be separate: `\|\c
- .B \-dr\c
- \&\|' is quite different from `\|\c
- .B \-d \-r
- \&\|'.
-
- Most `\|\c
- .B \-f\c
- \&\|' and `\|\c
- .B \-W\c
- \&\|' options have two contrary forms:
- .BI \-f name
- and
- .BI \-fno\- name\c
- \& (or
- .BI \-W name
- and
- .BI \-Wno\- name\c
- \&). Only the non-default forms are shown here.
-
- .TP
- .B \-c
- Compile or assemble the source files, but do not link. The compiler
- output is an object file corresponding to each source file.
- .TP
- .BI \-D macro
- Define macro \c
- .I macro\c
- \& with the string `\|\c
- .B 1\c
- \&\|' as its definition.
- .TP
- .BI \-D macro = defn
- Define macro \c
- .I macro\c
- \& as \c
- .I defn\c
- \&.
- .TP
- .B \-E
- Stop after the preprocessing stage; do not run the compiler proper. The
- output is preprocessed source code, which is sent to the
- standard output.
- .TP
- .BI +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 compatibility with cfront
- 1.x usage; the recommended GNU C++ usage is to use
- .B #pragma interface
- and
- .B
- #pragma implementation\c
- \&, instead.
-
- With `\|\c
- .B +e0\c
- \&\|', 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 `\|\c
- .B +e1\c
- \&\|',
- .B g++
- actually generates the code implementing virtual functions
- defined in the code, and makes them publicly visible.
- .TP
- .B \-fall\-virtual
- When you use the `\|\c
- .B \-fall\-virtual\c
- \&\|', 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 \c
- .I not\c
- \& mean that all calls to these methods will be made through the
- internal table of virtual functions. 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
- \&`\|\c
- .B
- operator->()()\c
- \&\|' implicitly virtual using `\|\c
- .B \-fall\-virtual\c
- \&\|' extends
- also to all non-constructor methods of any class derived from such a
- class.
- .TP
- .B \-fdollars\-in\-identifiers
- Permit the use of `\|\c
- .B $\c
- \&\|' in identifiers.
- Traditional C allowed the character `\|\c
- .B $\c
- \&\|' to form part of identifiers; by default, GNU C also
- allows this. However, ANSI C forbids `\|\c
- .B $\c
- \&\|' 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).
- .TP
- .B \-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:
- .sp
- .br
- A\ foo\ ();
- .br
- A\ x\ (foo\ ());\ \ \ //\ x\ initialized\ by\ `foo\ ()',\ no\ ctor\ called
- .br
- A\ y\ =\ foo\ ();\ \ \ //\ call\ to\ `foo\ ()'\ heads\ to\ temporary,
- .br
- \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ //\ y\ is\ initialized\ from\ the\ temporary.
- .br
- .sp
- Note the difference! With this flag, GNU C++ initializes `\|\c
- .B y\c
- \&\|' directly
- from the call to
- .B foo ()
- without going through a temporary.
- .TP
- .B \-fenum\-int\-equiv
- Normally GNU C++ allows conversion of
- .B enum
- to
- .B int\c
- \&, but not the other way around. Use this option if you want GNU C++
- to allow conversion of
- .B int
- to
- .B enum
- as well.
- .TP
- .B \-fgnu\-binutils
- .TP
- .B \-fno\-gnu\-binutils
- `\|\c
- .B \-fgnu\-binutils
- \&\|' (the default for most, but not all, platforms) makes GNU C++
- emit extra information for static initialization and finalization.
- This information has to be passed from the assembler to the GNU
- linker. Some assemblers won't pass this information; you must either
- use GNU
- .B as
- or specify the option `\|\c
- .B \-fno\-gnu\-binutils\c
- \&\|'.
-
- With `\|\c
- .B \-fno\-gnu\-binutils\c
- \&\|', you must use the program
- .B collect
- (part of the GCC distribution) for linking.
- .TP
- .B \-fmemoize\-lookups
- .TP
- .B \-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
- function 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
- .sp
- .br
- \ \ cout\ <<\ "This\ "\ <<\ p\ <<\ "\ has\ "\ <<\ n\ <<\ "\ legs.\en";
- .br
- .sp
- 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. `\|\c
- .B \-fmemoize\-lookups\c
- \&\|' enables
- the software cache.
-
- Because access privileges (visibility) to members and member functions
- may differ from one function context to the next,
- .B g++
- may need to flush the cache. With the `\|\c
- .B \-fmemoize\-lookups\c
- \&\|' flag, the cache is flushed after every
- function that is compiled. The `\|\c
- \-fsave\-memoized\c
- \&\|' flag enables the same software cache, but when the compiler
- 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 function has exactly the same access
- privileges as every other, and the cache need not be flushed.
- .TP
- .B \-fno\-default\-inline
- If `\|\c
- .B \-fdefault\-inline\c
- \&\|' is enabled then member functions defined inside class
- scope are compiled inline by default; i.e., you don't need to
- add `\|\c
- .B inline\c
- \&\|' in front of the member function name. By popular
- demand, this option is now the default. To keep GNU C++ from inlining
- these member functions, specify `\|\c
- .B \-fno\-default\-inline\c
- \&\|'.
- .TP
- .B \-fno\-strict\-prototype
- Consider the declaration \c
- .B int foo ();\c
- \&. In C++, this means that the
- function \c
- .B foo\c
- \& takes no arguments. In ANSI C, this is declared
- .B int foo(void);\c
- \&. With the flag `\|\c
- .B \-fno\-strict\-prototype\c
- \&\|',
- declaring functions with no arguments is equivalent to declaring its
- argument list to be untyped, i.e., \c
- .B int foo ();\c
- \& is equivalent to
- saying \c
- .B int foo (...);\c
- \&.
- .TP
- .B \-fnonnull\-objects
- Normally, GNU C++ makes conservative assumptions about objects reached
- through references. For example, the compiler must check that `\|\c
- .B a\c
- \&\|' is not null in code like the following:
- .br
- \ \ \ \ obj\ &a\ =\ g\ ();
- .br
- \ \ \ \ a.f\ (2);
- .br
- Checking that references of this sort have non-null values requires
- extra code, however, and it is unnecessary for many programs. You can
- use `\|\c
- .B \-fnonnull\-objects\c
- \&\|' to omit the checks for null, if your program doesn't require the
- default checking.
- .TP
- .B \-fthis\-is\-variable
- The incorporation of user-defined free store management into C++ has
- made assignment to \c
- .B this\c
- \& an anachronism. Therefore, by default GNU
- C++ treats the type of \c
- .B this\c
- \& in a member function of \c
- .B class X\c
- \&
- to be \c
- .B X *const\c
- \&. In other words, it is illegal to assign to
- \c
- .B this\c
- \& within a class member function. However, for backwards
- compatibility, you can invoke the old behavior by using
- \&`\|\c
- .B \-fthis\-is\-variable\c
- \&\|'.
- .TP
- .B \-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, `\|\c
- .B \-g\c
- \&\|' enables use
- of extra debugging information that only GDB can use.
-
- Unlike most other C compilers, GNU CC allows you to use `\|\c
- .B \-g\c
- \&\|' with
- `\|\c
- .B \-O\c
- \&\|'. The shortcuts taken by optimized code may occasionally
- produce surprising results: some variables you declared may not exist
- at all; flow of control 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 output. This makes
- it reasonable to use the optimizer for programs that might have bugs.
- .TP
- .BI "\-I" "dir"\c
- \&
- Append directory \c
- .I dir\c
- \& to the list of directories searched for include files.
- .TP
- .BI "\-L" "dir"\c
- \&
- Add directory \c
- .I dir\c
- \& to the list of directories to be searched
- for `\|\c
- .B \-l\c
- \&\|'.
- .TP
- .BI \-l library\c
- \&
- Use the library named \c
- .I library\c
- \& when linking. (C++ programs often require `\|\c
- \-lg++\c
- \&\|' for successful linking.)
- .TP
- .B \-O
- Optimize. Optimizing compilation takes somewhat more time, and a lot
- more memory for a large function.
-
- Without `\|\c
- .B \-O\c
- \&\|', 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 `\|\c
- .B \-O\c
- \&\|', only variables declared \c
- .B register\c
- \& are
- allocated in registers. The resulting compiled code is a little worse
- than produced by PCC without `\|\c
- .B \-O\c
- \&\|'.
-
- With `\|\c
- .B \-O\c
- \&\|', the compiler tries to reduce code size and execution
- time.
- .TP
- .BI "\-o " file\c
- \&
- Place output in file \c
- .I file\c
- \&.
- .TP
- .B \-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.
- .TP
- .B \-static
- On systems that support dynamic linking, this prevents linking with the shared
- libraries. On other systems, this option has no effect.
- .TP
- .B \-traditional
- Attempt to support some aspects of traditional C compilers.
-
- Specifically, for both C and C++ programs:
- .TP
- \ \ \ \(bu
- In the preprocessor, comments convert to nothing at all, rather than
- to a space. This allows traditional token concatenation.
- .TP
- \ \ \ \(bu
- 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.
- .TP
- \ \ \ \(bu
- The preprocessor does not predefine the macro \c
- .B __STDC__\c
- \& when you use
- `\|\c
- .B \-traditional\c
- \&\|', but still predefines\c
- .B __GNUC__\c
- \& (since the GNU extensions indicated by
- .B __GNUC__\c
- \& are not affected by
- `\|\c
- .B \-traditional\c
- \&\|'). If you need to write header files that work
- differently depending on whether `\|\c
- .B \-traditional\c
- \&\|' is in use, by
- testing both of these predefined macros you can distinguish four
- situations: GNU C, traditional GNU C, other ANSI C compilers, and
- other old C compilers.
- .TP
- \ \ \ \(bu
- In the preprocessor, comments convert to nothing at all, rather than
- to a space. This allows traditional token concatenation.
- .TP
- \ \ \ \(bu
- 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.
- .TP
- \ \ \ \(bu
- The preprocessor does not predefine the macro \c
- .B __STDC__\c
- \& when you use
- `\|\c
- .B \-traditional\c
- \&\|', but still predefines\c
- .B __GNUC__\c
- \& (since the GNU extensions indicated by
- .B __GNUC__\c
- \& are not affected by
- `\|\c
- .B \-traditional\c
- \&\|'). If you need to write header files that work
- differently depending on whether `\|\c
- .B \-traditional\c
- \&\|' is in use, by
- testing both of these predefined macros you can distinguish four
- situations: GNU C, traditional GNU C, other ANSI C compilers, and
- other old C compilers.
- .PP
- .TP
- \ \ \ \(bu
- 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
- `\|\c
- .B \-fwritable\-strings\c
- \&\|'.)
-
- For C++ programs only (not C), `\|\c
- .B \-traditional\c
- \&\|' has one additional effect: assignment to
- .B this
- is permitted. This is the same as the effect of `\|\c
- .B \-fthis\-is\-variable\c
- \&\|'.
- .TP
- .BI \-U macro
- Undefine macro \c
- .I macro\c
- \&.
- .TP
- .B \-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.
- .TP
- .B \-Wenum\-clash
- Warn when converting between different enumeration types.
- .TP
- .B \-Woverloaded\-virtual
- In a derived class, the definitions of virtual functions must match
- the type signature of a virtual function declared in the base class.
- Use this option to request warnings when a derived class declares a
- function that may be an erroneous attempt to define a virtual
- 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.
- .TP
- .B \-w
- Inhibit all warning messages.
- .PP
-
- .SH PRAGMAS
- Two `\|\c
- .B #pragma\c
- \&\|' directives are supported for GNU C++, to permit using the same
- header file for two purposes: as a definition of interfaces to a given
- object class, and as the full definition of the contents of that object class.
- .TP
- .B #pragma interface
- Use this directive in header files that define object 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 `\|\c
- .B #pragma interface\c
- \&\|' is included in a compilation, this auxiliary information
- will not be generated (unless the main input source file itself uses
- `\|\c
- .B #pragma implementation\c
- \&\|'). Instead, the object files will contain references to be
- resolved at link time.
- .tr !"
- .TP
- .B #pragma implementation
- .TP
- .BI "#pragma implementation !" objects .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 `\|\c
- .B #pragma interface\c
- \&\|'.
- 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 `\|\c
- .B #pragma implementation\c
- \&\|' with no argument, it applies to an include file with the same
- basename as your source file; for example, in `\|\c
- .B allclass.cc\c
- \&\|', `\|\c
- .B #pragma implementation\c
- \&\|' by itself is equivalent to `\|\c
- .B
- #pragma implementation "allclass.h"\c
- \&\|'. 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.
- .SH FILES
- .ta \w'LIBDIR/g++\-include 'u
- file.h C header (preprocessor) file
- .br
- file.i preprocessed C source file
- .br
- file.C C++ source file
- .br
- file.cc C++ source file
- .br
- file.cxx C++ source file
- .br
- file.s assembly language file
- .br
- file.o object file
- .br
- a.out link edited output
- .br
- \fITMPDIR\fR/cc\(** temporary files
- .br
- \fILIBDIR\fR/cpp preprocessor
- .br
- \fILIBDIR\fR/cc1plus compiler
- .br
- \fILIBDIR\fR/collect linker front end needed on some machines
- .br
- \fILIBDIR\fR/libgcc.a GCC subroutine library
- .br
- /lib/crt[01n].o start-up routine
- .br
- \fILIBDIR\fR/ccrt0 additional start-up routine for C++
- .br
- /lib/libc.a standard C library, see
- .IR intro (3)
- .br
- /usr/include standard directory for
- .B #include
- files
- .br
- \fILIBDIR\fR/include standard gcc directory for
- .B #include
- files
- .br
- \fILIBDIR\fR/g++\-include additional g++ directory for
- .B #include
- .sp
- .I LIBDIR
- is usually
- .B /usr/local/lib/\c
- .IR machine / version .
- .br
- .I TMPDIR
- comes from the environment variable
- .B TMPDIR
- (default
- .B /usr/tmp
- if available, else
- .B /tmp\c
- \&).
- .SH "SEE ALSO"
- gcc(1), cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).
- .br
- .RB "`\|" gcc "\|', `\|" cpp \|',
- .RB `\| as \|', `\| ld \|',
- and
- .RB `\| gdb \|'
- entries in
- .B info\c
- \&.
- .br
- .I
- Using and Porting GNU CC (for version 2.0)\c
- , Richard M. Stallman, November 1990;
- .I
- The C Preprocessor\c
- , Richard M. Stallman, July 1990;
- .I
- Using GDB: A Guide to the GNU Source-Level Debugger\c
- , Richard M. Stallman and Roland H. Pesch, December 1991;
- .I
- Using as: the GNU Assembler\c
- , Dean Elsner, Jay Fenlason & friends, March 1991;
- .I
- gld: the GNU linker\c
- , Steve Chamberlain and Roland Pesch, April 1991.
-
- .SH BUGS
- Report bugs to
- .BR bug\-g++@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.
- .SH COPYING
- Copyright (c) 1991 Free Software Foundation, Inc.
- .PP
- Permission is granted to make and distribute verbatim copies of
- this manual provided the copyright notice and this permission notice
- are preserved on all copies.
- .PP
- Permission is granted to copy and distribute modified versions of this
- manual under the conditions for verbatim copying, provided that the
- entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- .PP
- Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions 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.
- .SH AUTHORS
- See the GNU CC Manual for the contributors to GNU CC.
-