blob: a4d49f8a2d09c1d22e1dd03fa1b0fedcddaadaf2 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2015 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below). A copy of the license is included in the section entitled
"GNU Free Documentation License".
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNU Compiler Collection (GCC): C++ Attributes</title>
<meta name="description" content="Using the GNU Compiler Collection (GCC): C++ Attributes">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): C++ Attributes">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="C_002b_002b-Extensions.html#C_002b_002b-Extensions" rel="up" title="C++ Extensions">
<link href="Function-Multiversioning.html#Function-Multiversioning" rel="next" title="Function Multiversioning">
<link href="Bound-member-functions.html#Bound-member-functions" rel="prev" title="Bound member functions">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="C_002b_002b-Attributes"></a>
<div class="header">
<p>
Next: <a href="Function-Multiversioning.html#Function-Multiversioning" accesskey="n" rel="next">Function Multiversioning</a>, Previous: <a href="Bound-member-functions.html#Bound-member-functions" accesskey="p" rel="prev">Bound member functions</a>, Up: <a href="C_002b_002b-Extensions.html#C_002b_002b-Extensions" accesskey="u" rel="up">C++ Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="C_002b_002b_002dSpecific-Variable_002c-Function_002c-and-Type-Attributes"></a>
<h3 class="section">7.7 C++-Specific Variable, Function, and Type Attributes</h3>
<p>Some attributes only make sense for C++ programs.
</p>
<dl compact="compact">
<dt><code>abi_tag (&quot;<var>tag</var>&quot;, ...)</code></dt>
<dd><a name="index-abi_005ftag-attribute"></a>
<p>The <code>abi_tag</code> attribute can be applied to a function or class
declaration. It modifies the mangled name of the function or class to
incorporate the tag name, in order to distinguish the function or
class from an earlier version with a different ABI; perhaps the class
has changed size, or the function has a different return type that is
not encoded in the mangled name.
</p>
<p>The argument can be a list of strings of arbitrary length. The
strings are sorted on output, so the order of the list is
unimportant.
</p>
<p>A redeclaration of a function or class must not add new ABI tags,
since doing so would change the mangled name.
</p>
<p>The ABI tags apply to a name, so all instantiations and
specializations of a template have the same tags. The attribute will
be ignored if applied to an explicit specialization or instantiation.
</p>
<p>The <samp>-Wabi-tag</samp> flag enables a warning about a class which does
not have all the ABI tags used by its subobjects and virtual functions; for users with code
that needs to coexist with an earlier ABI, using this option can help
to find all affected types that need to be tagged.
</p>
</dd>
<dt><code>init_priority (<var>priority</var>)</code></dt>
<dd><a name="index-init_005fpriority-attribute"></a>
<p>In Standard C++, objects defined at namespace scope are guaranteed to be
initialized in an order in strict accordance with that of their definitions
<em>in a given translation unit</em>. No guarantee is made for initializations
across translation units. However, GNU C++ allows users to control the
order of initialization of objects defined at namespace scope with the
<code>init_priority</code> attribute by specifying a relative <var>priority</var>,
a constant integral expression currently bounded between 101 and 65535
inclusive. Lower numbers indicate a higher priority.
</p>
<p>In the following example, <code>A</code> would normally be created before
<code>B</code>, but the <code>init_priority</code> attribute reverses that order:
</p>
<div class="smallexample">
<pre class="smallexample">Some_Class A __attribute__ ((init_priority (2000)));
Some_Class B __attribute__ ((init_priority (543)));
</pre></div>
<p>Note that the particular values of <var>priority</var> do not matter; only their
relative ordering.
</p>
</dd>
<dt><code>java_interface</code></dt>
<dd><a name="index-java_005finterface-attribute"></a>
<p>This type attribute informs C++ that the class is a Java interface. It may
only be applied to classes declared within an <code>extern &quot;Java&quot;</code> block.
Calls to methods declared in this interface are dispatched using GCJ&rsquo;s
interface table mechanism, instead of regular virtual table dispatch.
</p>
</dd>
<dt><code>warn_unused</code></dt>
<dd><a name="index-warn_005funused-attribute"></a>
<p>For C++ types with non-trivial constructors and/or destructors it is
impossible for the compiler to determine whether a variable of this
type is truly unused if it is not referenced. This type attribute
informs the compiler that variables of this type should be warned
about if they appear to be unused, just like variables of fundamental
types.
</p>
<p>This attribute is appropriate for types which just represent a value,
such as <code>std::string</code>; it is not appropriate for types which
control a resource, such as <code>std::mutex</code>.
</p>
<p>This attribute is also accepted in C, but it is unnecessary because C
does not have constructors or destructors.
</p>
</dd>
</dl>
<p>See also <a href="Namespace-Association.html#Namespace-Association">Namespace Association</a>.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Function-Multiversioning.html#Function-Multiversioning" accesskey="n" rel="next">Function Multiversioning</a>, Previous: <a href="Bound-member-functions.html#Bound-member-functions" accesskey="p" rel="prev">Bound member functions</a>, Up: <a href="C_002b_002b-Extensions.html#C_002b_002b-Extensions" accesskey="u" rel="up">C++ Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>