You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

C_002b_002b-Attributes.html 8.4KB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2020 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  20. <title>C++ Attributes (Using the GNU Compiler Collection (GCC))</title>
  21. <meta name="description" content="C++ Attributes (Using the GNU Compiler Collection (GCC))">
  22. <meta name="keywords" content="C++ Attributes (Using the GNU Compiler Collection (GCC))">
  23. <meta name="resource-type" content="document">
  24. <meta name="distribution" content="global">
  25. <meta name="Generator" content="makeinfo">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="C_002b_002b-Extensions.html#C_002b_002b-Extensions" rel="up" title="C++ Extensions">
  30. <link href="Function-Multiversioning.html#Function-Multiversioning" rel="next" title="Function Multiversioning">
  31. <link href="Bound-member-functions.html#Bound-member-functions" rel="prev" title="Bound member functions">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.indentedblock {margin-right: 0em}
  36. blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
  37. blockquote.smallquotation {font-size: smaller}
  38. div.display {margin-left: 3.2em}
  39. div.example {margin-left: 3.2em}
  40. div.lisp {margin-left: 3.2em}
  41. div.smalldisplay {margin-left: 3.2em}
  42. div.smallexample {margin-left: 3.2em}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style: oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nolinebreak {white-space: nowrap}
  54. span.roman {font-family: initial; font-weight: normal}
  55. span.sansserif {font-family: sans-serif; font-weight: normal}
  56. ul.no-bullet {list-style: none}
  57. -->
  58. </style>
  59. </head>
  60. <body lang="en">
  61. <a name="C_002b_002b-Attributes"></a>
  62. <div class="header">
  63. <p>
  64. 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>
  65. </div>
  66. <hr>
  67. <a name="C_002b_002b_002dSpecific-Variable_002c-Function_002c-and-Type-Attributes"></a>
  68. <h3 class="section">7.7 C++-Specific Variable, Function, and Type Attributes</h3>
  69. <p>Some attributes only make sense for C++ programs.
  70. </p>
  71. <dl compact="compact">
  72. <dt><code>abi_tag (&quot;<var>tag</var>&quot;, ...)</code></dt>
  73. <dd><a name="index-abi_005ftag-function-attribute"></a>
  74. <a name="index-abi_005ftag-variable-attribute"></a>
  75. <a name="index-abi_005ftag-type-attribute"></a>
  76. <p>The <code>abi_tag</code> attribute can be applied to a function, variable, or class
  77. declaration. It modifies the mangled name of the entity to
  78. incorporate the tag name, in order to distinguish the function or
  79. class from an earlier version with a different ABI; perhaps the class
  80. has changed size, or the function has a different return type that is
  81. not encoded in the mangled name.
  82. </p>
  83. <p>The attribute can also be applied to an inline namespace, but does not
  84. affect the mangled name of the namespace; in this case it is only used
  85. for <samp>-Wabi-tag</samp> warnings and automatic tagging of functions and
  86. variables. Tagging inline namespaces is generally preferable to
  87. tagging individual declarations, but the latter is sometimes
  88. necessary, such as when only certain members of a class need to be
  89. tagged.
  90. </p>
  91. <p>The argument can be a list of strings of arbitrary length. The
  92. strings are sorted on output, so the order of the list is
  93. unimportant.
  94. </p>
  95. <p>A redeclaration of an entity must not add new ABI tags,
  96. since doing so would change the mangled name.
  97. </p>
  98. <p>The ABI tags apply to a name, so all instantiations and
  99. specializations of a template have the same tags. The attribute will
  100. be ignored if applied to an explicit specialization or instantiation.
  101. </p>
  102. <p>The <samp>-Wabi-tag</samp> flag enables a warning about a class which does
  103. not have all the ABI tags used by its subobjects and virtual functions; for users with code
  104. that needs to coexist with an earlier ABI, using this option can help
  105. to find all affected types that need to be tagged.
  106. </p>
  107. <p>When a type involving an ABI tag is used as the type of a variable or
  108. return type of a function where that tag is not already present in the
  109. signature of the function, the tag is automatically applied to the
  110. variable or function. <samp>-Wabi-tag</samp> also warns about this
  111. situation; this warning can be avoided by explicitly tagging the
  112. variable or function or moving it into a tagged inline namespace.
  113. </p>
  114. </dd>
  115. <dt><code>init_priority (<var>priority</var>)</code></dt>
  116. <dd><a name="index-init_005fpriority-variable-attribute"></a>
  117. <p>In Standard C++, objects defined at namespace scope are guaranteed to be
  118. initialized in an order in strict accordance with that of their definitions
  119. <em>in a given translation unit</em>. No guarantee is made for initializations
  120. across translation units. However, GNU C++ allows users to control the
  121. order of initialization of objects defined at namespace scope with the
  122. <code>init_priority</code> attribute by specifying a relative <var>priority</var>,
  123. a constant integral expression currently bounded between 101 and 65535
  124. inclusive. Lower numbers indicate a higher priority.
  125. </p>
  126. <p>In the following example, <code>A</code> would normally be created before
  127. <code>B</code>, but the <code>init_priority</code> attribute reverses that order:
  128. </p>
  129. <div class="smallexample">
  130. <pre class="smallexample">Some_Class A __attribute__ ((init_priority (2000)));
  131. Some_Class B __attribute__ ((init_priority (543)));
  132. </pre></div>
  133. <p>Note that the particular values of <var>priority</var> do not matter; only their
  134. relative ordering.
  135. </p>
  136. </dd>
  137. <dt><code>warn_unused</code></dt>
  138. <dd><a name="index-warn_005funused-type-attribute"></a>
  139. <p>For C++ types with non-trivial constructors and/or destructors it is
  140. impossible for the compiler to determine whether a variable of this
  141. type is truly unused if it is not referenced. This type attribute
  142. informs the compiler that variables of this type should be warned
  143. about if they appear to be unused, just like variables of fundamental
  144. types.
  145. </p>
  146. <p>This attribute is appropriate for types which just represent a value,
  147. such as <code>std::string</code>; it is not appropriate for types which
  148. control a resource, such as <code>std::lock_guard</code>.
  149. </p>
  150. <p>This attribute is also accepted in C, but it is unnecessary because C
  151. does not have constructors or destructors.
  152. </p>
  153. </dd>
  154. </dl>
  155. <hr>
  156. <div class="header">
  157. <p>
  158. 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>
  159. </div>
  160. </body>
  161. </html>