⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extend.texi

📁 GCC
💻 TEXI
📖 第 1 页 / 共 5 页
字号:
(a ? b = 5 : (c = 5))
@end example

A cast is a valid lvalue if its operand is an lvalue.  A simple
assignment whose left-hand side is a cast works by converting the
right-hand side first to the specified type, then to the type of the
inner left-hand side expression.  After this is stored, the value is
converted back to the specified type to become the value of the
assignment.  Thus, if @code{a} has type @code{char *}, the following two
expressions are equivalent:

@example
(int)a = 5
(int)(a = (char *)(int)5)
@end example

An assignment-with-arithmetic operation such as @samp{+=} applied to a cast
performs the arithmetic using the type resulting from the cast, and then
continues as in the previous case.  Therefore, these two expressions are
equivalent:

@example
(int)a += 5
(int)(a = (char *)(int) ((int)a + 5))
@end example

You cannot take the address of an lvalue cast, because the use of its
address would not work out coherently.  Suppose that @code{&(int)f} were
permitted, where @code{f} has type @code{float}.  Then the following
statement would try to store an integer bit-pattern where a floating
point number belongs:

@example
*&(int)f = 1;
@end example

This is quite different from what @code{(int)f = 1} would do---that
would convert 1 to floating point and store it.  Rather than cause this
inconsistency, we think it is better to prohibit use of @samp{&} on a cast.

If you really do want an @code{int *} pointer with the address of
@code{f}, you can simply write @code{(int *)&f}.

@node Conditionals
@section Conditionals with Omitted Operands
@cindex conditional expressions, extensions
@cindex omitted middle-operands
@cindex middle-operands, omitted
@cindex extensions, @code{?:}
@cindex @code{?:} extensions

The middle operand in a conditional expression may be omitted.  Then
if the first operand is nonzero, its value is the value of the conditional
expression.

Therefore, the expression

@example
x ? : y
@end example

@noindent
has the value of @code{x} if that is nonzero; otherwise, the value of
@code{y}.

This example is perfectly equivalent to

@example
x ? x : y
@end example

@cindex side effect in ?:
@cindex ?: side effect
@noindent
In this simple case, the ability to omit the middle operand is not
especially useful.  When it becomes useful is when the first operand does,
or may (if it is a macro argument), contain a side effect.  Then repeating
the operand in the middle would perform the side effect twice.  Omitting
the middle operand uses the value already computed without the undesirable
effects of recomputing it.

@node Long Long
@section Double-Word Integers
@cindex @code{long long} data types
@cindex double-word arithmetic
@cindex multiprecision arithmetic
@cindex @code{LL} integer suffix
@cindex @code{ULL} integer suffix

ISO C99 supports data types for integers that are at least 64 bits wide,
and as an extension GCC supports them in C89 mode and in C++.
Simply write @code{long long int} for a signed integer, or
@code{unsigned long long int} for an unsigned integer.  To make an
integer constant of type @code{long long int}, add the suffix @samp{LL}
to the integer.  To make an integer constant of type @code{unsigned long
long int}, add the suffix @samp{ULL} to the integer.

You can use these types in arithmetic like any other integer types.
Addition, subtraction, and bitwise boolean operations on these types
are open-coded on all types of machines.  Multiplication is open-coded
if the machine supports fullword-to-doubleword a widening multiply
instruction.  Division and shifts are open-coded only on machines that
provide special support.  The operations that are not open-coded use
special library routines that come with GNU CC.

There may be pitfalls when you use @code{long long} types for function
arguments, unless you declare function prototypes.  If a function
expects type @code{int} for its argument, and you pass a value of type
@code{long long int}, confusion will result because the caller and the
subroutine will disagree about the number of bytes for the argument.
Likewise, if the function expects @code{long long int} and you pass
@code{int}.  The best way to avoid such problems is to use prototypes.

@node Complex
@section Complex Numbers
@cindex complex numbers
@cindex @code{_Complex} keyword
@cindex @code{__complex__} keyword

ISO C99 supports complex floating data types, and as an extension GCC
supports them in C89 mode and in C++, and supports complex integer data
types which are not part of ISO C99.  You can declare complex types
using the keyword @code{_Complex}.  As an extension, the older GNU
keyword @code{__complex__} is also supported.

For example, @samp{_Complex double x;} declares @code{x} as a
variable whose real part and imaginary part are both of type
@code{double}.  @samp{_Complex short int y;} declares @code{y} to
have real and imaginary parts of type @code{short int}; this is not
likely to be useful, but it shows that the set of complex types is
complete.

To write a constant with a complex data type, use the suffix @samp{i} or
@samp{j} (either one; they are equivalent).  For example, @code{2.5fi}
has type @code{_Complex float} and @code{3i} has type
@code{_Complex int}.  Such a constant always has a pure imaginary
value, but you can form any complex value you like by adding one to a
real constant.  This is a GNU extension; if you have an ISO C99
conforming C library (such as GNU libc), and want to construct complex
constants of floating type, you should include @code{<complex.h>} and
use the macros @code{I} or @code{_Complex_I} instead.

@cindex @code{__real__} keyword
@cindex @code{__imag__} keyword
To extract the real part of a complex-valued expression @var{exp}, write
@code{__real__ @var{exp}}.  Likewise, use @code{__imag__} to
extract the imaginary part.  This is a GNU extension; for values of
floating type, you should use the ISO C99 functions @code{crealf},
@code{creal}, @code{creall}, @code{cimagf}, @code{cimag} and
@code{cimagl}, declared in @code{<complex.h>} and also provided as
built-in functions by GCC.

@cindex complex conjugation
The operator @samp{~} performs complex conjugation when used on a value
with a complex type.  This is a GNU extension; for values of
floating type, you should use the ISO C99 functions @code{conjf},
@code{conj} and @code{conjl}, declared in @code{<complex.h>} and also
provided as built-in functions by GCC.

GNU CC can allocate complex automatic variables in a noncontiguous
fashion; it's even possible for the real part to be in a register while
the imaginary part is on the stack (or vice-versa).  None of the
supported debugging info formats has a way to represent noncontiguous
allocation like this, so GNU CC describes a noncontiguous complex
variable as if it were two separate variables of noncomplex type.
If the variable's actual name is @code{foo}, the two fictitious
variables are named @code{foo$real} and @code{foo$imag}.  You can
examine and set these two fictitious variables with your debugger.

A future version of GDB will know how to recognize such pairs and treat
them as a single variable with a complex type.

@node Hex Floats
@section Hex Floats
@cindex hex floats

ISO C99 supports floating-point numbers written not only in the usual
decimal notation, such as @code{1.55e1}, but also numbers such as
@code{0x1.fp3} written in hexadecimal format.  As a GNU extension, GCC
supports this in C89 mode (except in some cases when strictly
conforming) and in C++.  In that format the
@samp{0x} hex introducer and the @samp{p} or @samp{P} exponent field are
mandatory.  The exponent is a decimal number that indicates the power of
2 by which the significant part will be multiplied.  Thus @samp{0x1.f} is
1 15/16, @samp{p3} multiplies it by 8, and the value of @code{0x1.fp3}
is the same as @code{1.55e1}.

Unlike for floating-point numbers in the decimal notation the exponent
is always required in the hexadecimal notation.  Otherwise the compiler
would not be able to resolve the ambiguity of, e.g., @code{0x1.f}.  This
could mean @code{1.0f} or @code{1.9375} since @samp{f} is also the
extension for floating-point constants of type @code{float}.

@node Zero Length
@section Arrays of Length Zero
@cindex arrays of length zero
@cindex zero-length arrays
@cindex length-zero arrays
@cindex flexible array members

Zero-length arrays are allowed in GNU C.  They are very useful as the
last element of a structure which is really a header for a variable-length
object:

@example
struct line @{
  int length;
  char contents[0];
@};

struct line *thisline = (struct line *)
  malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
@end example

In ISO C89, you would have to give @code{contents} a length of 1, which
means either you waste space or complicate the argument to @code{malloc}.

In ISO C99, you would use a @dfn{flexible array member}, which is
slightly different in syntax and semantics:

@itemize @bullet
@item
Flexible array members are written as @code{contents[]} without
the @code{0}.

@item
Flexible array members have incomplete type, and so the @code{sizeof}
operator may not be applied.  As a quirk of the original implementation
of zero-length arrays, @code{sizeof} evaluates to zero.

@item
Flexible array members may only appear as the last member of a
@code{struct} that is otherwise non-empty.  GCC currently allows
zero-length arrays anywhere.  You may encounter problems, however,
defining structures containing only a zero-length array.  Such usage
is deprecated, and we recommend using zero-length arrays only in
places in which flexible array members would be allowed.
@end itemize

GCC versions before 3.0 allowed zero-length arrays to be statically
initialized.  In addition to those cases that were useful, it also
allowed initializations in situations that would corrupt later data.
Non-empty initialization of zero-length arrays is now deprecated.

Instead GCC allows static initialization of flexible array members.
This is equivalent to defining a new structure containing the original
structure followed by an array of sufficient size to contain the data.
I.e. in the following, @code{f1} is constructed as if it were declared
like @code{f2}.

@example
struct f1 @{
  int x; int y[];
@} f1 = @{ 1, @{ 2, 3, 4 @} @};

struct f2 @{
  struct f1 f1; int data[3];
@} f2 = @{ @{ 1 @}, @{ 2, 3, 4 @} @};
@end example

@noindent
The convenience of this extension is that @code{f1} has the desired
type, eliminating the need to consistently refer to @code{f2.f1}.

This has symmetry with normal static arrays, in that an array of
unknown size is also written with @code{[]}.

Of course, this extension only makes sense if the extra data comes at
the end of a top-level object, as otherwise we would be overwriting
data at subsequent offsets.  To avoid undue complication and confusion
with initialization of deeply nested arrays, we simply disallow any
non-empty initialization except when the structure is the top-level
object.  For example:

@example
struct foo @{ int x; int y[]; @};
struct bar @{ struct foo z; @};

struct foo a = @{ 1, @{ 2, 3, 4 @} @};        // Legal.
struct bar b = @{ @{ 1, @{ 2, 3, 4 @} @} @};    // Illegal.
struct bar c = @{ @{ 1, @{ @} @} @};            // Legal.
struct foo d[1] = @{ @{ 1 @{ 2, 3, 4 @} @} @};  // Illegal.
@end example

@node Variable Length
@section Arrays of Variable Length
@cindex variable-length arrays
@cindex arrays of variable length
@cindex VLAs

Variable-length automatic arrays are allowed in ISO C99, and as an
extension GCC accepts them in C89 mode and in C++.  (However, GCC's
implementation of variable-length arrays does not yet conform in detail
to the ISO C99 standard.)  These arrays are
declared like any other automatic arrays, but with a length that is not
a constant expression.  The storage is allocated at the point of
declaration and deallocated when the brace-level is exited.  For
example:

@example
FILE *
concat_fopen (char *s1, char *s2, char *mode)
@{
  char str[strlen (s1) + strlen (s2) + 1];
  strcpy (str, s1);
  strcat (str, s2);
  return fopen (str, mode);
@}
@end example

@cindex scope of a variable length array
@cindex variable-length array scope
@cindex deallocating variable length arrays
Jumping or breaking out of the scope of the array name deallocates the
storage.  Jumping into the scope is not allowed; you get an error
message for it.

@cindex @code{alloca} vs variable-length arrays
You can use the function @code{alloca} to get an effect much like
variable-length arrays.  The function @code{alloca} is available in
many other C implementations (but not in all).  On the other hand,
variable-length arrays are more elegant.

There are other differences between these two methods.  Space allocated
with @code{alloca} exists until the containing @emph{function} returns.
The space for a variable-length array is deallocated as soon as the array
name's scope ends.  (If you use both variable-length arrays and
@code{alloca} in the same function, deallocation of a variable-length array
will also deallocate anything more recently allocated with @code{alloca}.)

You can also use variable-length arrays as arguments to functions:

@example
struct entry
tester (int len, char data[len][len])
@{
  @dots{}
@}
@end example

The length of an array is computed once when the storage is allocated
and is remembered for the scope of the array in case you access it with
@code{sizeof}.

If you want to pass the array first and the length afterward, you can
use a forward declaration in the parameter list---another GNU extension.

@example
struct entry
tester (int len; char data[len][len], int len)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -