Attribute-Syntax.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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-2017 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 5.2, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <title>Using the GNU Compiler Collection (GCC): Attribute Syntax</title>
  20. <meta name="description" content="Using the GNU Compiler Collection (GCC): Attribute Syntax">
  21. <meta name="keywords" content="Using the GNU Compiler Collection (GCC): Attribute Syntax">
  22. <meta name="resource-type" content="document">
  23. <meta name="distribution" content="global">
  24. <meta name="Generator" content="makeinfo">
  25. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  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-Extensions.html#C-Extensions" rel="up" title="C Extensions">
  30. <link href="Function-Prototypes.html#Function-Prototypes" rel="next" title="Function Prototypes">
  31. <link href="Statement-Attributes.html#Statement-Attributes" rel="prev" title="Statement Attributes">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.smallquotation {font-size: smaller}
  36. div.display {margin-left: 3.2em}
  37. div.example {margin-left: 3.2em}
  38. div.indentedblock {margin-left: 3.2em}
  39. div.lisp {margin-left: 3.2em}
  40. div.smalldisplay {margin-left: 3.2em}
  41. div.smallexample {margin-left: 3.2em}
  42. div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
  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.nocodebreak {white-space:nowrap}
  54. span.nolinebreak {white-space:nowrap}
  55. span.roman {font-family:serif; font-weight:normal}
  56. span.sansserif {font-family:sans-serif; font-weight:normal}
  57. ul.no-bullet {list-style: none}
  58. -->
  59. </style>
  60. </head>
  61. <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
  62. <a name="Attribute-Syntax"></a>
  63. <div class="header">
  64. <p>
  65. Next: <a href="Function-Prototypes.html#Function-Prototypes" accesskey="n" rel="next">Function Prototypes</a>, Previous: <a href="Statement-Attributes.html#Statement-Attributes" accesskey="p" rel="prev">Statement Attributes</a>, Up: <a href="C-Extensions.html#C-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>
  66. </div>
  67. <hr>
  68. <a name="Attribute-Syntax-1"></a>
  69. <h3 class="section">6.37 Attribute Syntax</h3>
  70. <a name="index-attribute-syntax"></a>
  71. <p>This section describes the syntax with which <code>__attribute__</code> may be
  72. used, and the constructs to which attribute specifiers bind, for the C
  73. language. Some details may vary for C++ and Objective-C. Because of
  74. infelicities in the grammar for attributes, some forms described here
  75. may not be successfully parsed in all cases.
  76. </p>
  77. <p>There are some problems with the semantics of attributes in C++. For
  78. example, there are no manglings for attributes, although they may affect
  79. code generation, so problems may arise when attributed types are used in
  80. conjunction with templates or overloading. Similarly, <code>typeid</code>
  81. does not distinguish between types with different attributes. Support
  82. for attributes in C++ may be restricted in future to attributes on
  83. declarations only, but not on nested declarators.
  84. </p>
  85. <p>See <a href="Function-Attributes.html#Function-Attributes">Function Attributes</a>, for details of the semantics of attributes
  86. applying to functions. See <a href="Variable-Attributes.html#Variable-Attributes">Variable Attributes</a>, for details of the
  87. semantics of attributes applying to variables. See <a href="Type-Attributes.html#Type-Attributes">Type Attributes</a>,
  88. for details of the semantics of attributes applying to structure, union
  89. and enumerated types.
  90. See <a href="Label-Attributes.html#Label-Attributes">Label Attributes</a>, for details of the semantics of attributes
  91. applying to labels.
  92. See <a href="Enumerator-Attributes.html#Enumerator-Attributes">Enumerator Attributes</a>, for details of the semantics of attributes
  93. applying to enumerators.
  94. See <a href="Statement-Attributes.html#Statement-Attributes">Statement Attributes</a>, for details of the semantics of attributes
  95. applying to statements.
  96. </p>
  97. <p>An <em>attribute specifier</em> is of the form
  98. <code>__attribute__ ((<var>attribute-list</var>))</code>. An <em>attribute list</em>
  99. is a possibly empty comma-separated sequence of <em>attributes</em>, where
  100. each attribute is one of the following:
  101. </p>
  102. <ul>
  103. <li> Empty. Empty attributes are ignored.
  104. </li><li> An attribute name
  105. (which may be an identifier such as <code>unused</code>, or a reserved
  106. word such as <code>const</code>).
  107. </li><li> An attribute name followed by a parenthesized list of
  108. parameters for the attribute.
  109. These parameters take one of the following forms:
  110. <ul>
  111. <li> An identifier. For example, <code>mode</code> attributes use this form.
  112. </li><li> An identifier followed by a comma and a non-empty comma-separated list
  113. of expressions. For example, <code>format</code> attributes use this form.
  114. </li><li> A possibly empty comma-separated list of expressions. For example,
  115. <code>format_arg</code> attributes use this form with the list being a single
  116. integer constant expression, and <code>alias</code> attributes use this form
  117. with the list being a single string constant.
  118. </li></ul>
  119. </li></ul>
  120. <p>An <em>attribute specifier list</em> is a sequence of one or more attribute
  121. specifiers, not separated by any other tokens.
  122. </p>
  123. <p>You may optionally specify attribute names with &lsquo;<samp>__</samp>&rsquo;
  124. preceding and following the name.
  125. This allows you to use them in header files without
  126. being concerned about a possible macro of the same name. For example,
  127. you may use the attribute name <code>__noreturn__</code> instead of <code>noreturn</code>.
  128. </p>
  129. <a name="Label-Attributes-2"></a>
  130. <h4 class="subsubheading">Label Attributes</h4>
  131. <p>In GNU C, an attribute specifier list may appear after the colon following a
  132. label, other than a <code>case</code> or <code>default</code> label. GNU C++ only permits
  133. attributes on labels if the attribute specifier is immediately
  134. followed by a semicolon (i.e., the label applies to an empty
  135. statement). If the semicolon is missing, C++ label attributes are
  136. ambiguous, as it is permissible for a declaration, which could begin
  137. with an attribute list, to be labelled in C++. Declarations cannot be
  138. labelled in C90 or C99, so the ambiguity does not arise there.
  139. </p>
  140. <a name="Enumerator-Attributes-2"></a>
  141. <h4 class="subsubheading">Enumerator Attributes</h4>
  142. <p>In GNU C, an attribute specifier list may appear as part of an enumerator.
  143. The attribute goes after the enumeration constant, before <code>=</code>, if
  144. present. The optional attribute in the enumerator appertains to the
  145. enumeration constant. It is not possible to place the attribute after
  146. the constant expression, if present.
  147. </p>
  148. <a name="Statement-Attributes-2"></a>
  149. <h4 class="subsubheading">Statement Attributes</h4>
  150. <p>In GNU C, an attribute specifier list may appear as part of a null
  151. statement. The attribute goes before the semicolon.
  152. </p>
  153. <a name="Type-Attributes-1"></a>
  154. <h4 class="subsubheading">Type Attributes</h4>
  155. <p>An attribute specifier list may appear as part of a <code>struct</code>,
  156. <code>union</code> or <code>enum</code> specifier. It may go either immediately
  157. after the <code>struct</code>, <code>union</code> or <code>enum</code> keyword, or after
  158. the closing brace. The former syntax is preferred.
  159. Where attribute specifiers follow the closing brace, they are considered
  160. to relate to the structure, union or enumerated type defined, not to any
  161. enclosing declaration the type specifier appears in, and the type
  162. defined is not complete until after the attribute specifiers.
  163. </p>
  164. <a name="All-other-attributes"></a>
  165. <h4 class="subsubheading">All other attributes</h4>
  166. <p>Otherwise, an attribute specifier appears as part of a declaration,
  167. counting declarations of unnamed parameters and type names, and relates
  168. to that declaration (which may be nested in another declaration, for
  169. example in the case of a parameter declaration), or to a particular declarator
  170. within a declaration. Where an
  171. attribute specifier is applied to a parameter declared as a function or
  172. an array, it should apply to the function or array rather than the
  173. pointer to which the parameter is implicitly converted, but this is not
  174. yet correctly implemented.
  175. </p>
  176. <p>Any list of specifiers and qualifiers at the start of a declaration may
  177. contain attribute specifiers, whether or not such a list may in that
  178. context contain storage class specifiers. (Some attributes, however,
  179. are essentially in the nature of storage class specifiers, and only make
  180. sense where storage class specifiers may be used; for example,
  181. <code>section</code>.) There is one necessary limitation to this syntax: the
  182. first old-style parameter declaration in a function definition cannot
  183. begin with an attribute specifier, because such an attribute applies to
  184. the function instead by syntax described below (which, however, is not
  185. yet implemented in this case). In some other cases, attribute
  186. specifiers are permitted by this grammar but not yet supported by the
  187. compiler. All attribute specifiers in this place relate to the
  188. declaration as a whole. In the obsolescent usage where a type of
  189. <code>int</code> is implied by the absence of type specifiers, such a list of
  190. specifiers and qualifiers may be an attribute specifier list with no
  191. other specifiers or qualifiers.
  192. </p>
  193. <p>At present, the first parameter in a function prototype must have some
  194. type specifier that is not an attribute specifier; this resolves an
  195. ambiguity in the interpretation of <code>void f(int
  196. (__attribute__((foo)) x))</code>, but is subject to change. At present, if
  197. the parentheses of a function declarator contain only attributes then
  198. those attributes are ignored, rather than yielding an error or warning
  199. or implying a single parameter of type int, but this is subject to
  200. change.
  201. </p>
  202. <p>An attribute specifier list may appear immediately before a declarator
  203. (other than the first) in a comma-separated list of declarators in a
  204. declaration of more than one identifier using a single list of
  205. specifiers and qualifiers. Such attribute specifiers apply
  206. only to the identifier before whose declarator they appear. For
  207. example, in
  208. </p>
  209. <div class="smallexample">
  210. <pre class="smallexample">__attribute__((noreturn)) void d0 (void),
  211. __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
  212. d2 (void);
  213. </pre></div>
  214. <p>the <code>noreturn</code> attribute applies to all the functions
  215. declared; the <code>format</code> attribute only applies to <code>d1</code>.
  216. </p>
  217. <p>An attribute specifier list may appear immediately before the comma,
  218. <code>=</code> or semicolon terminating the declaration of an identifier other
  219. than a function definition. Such attribute specifiers apply
  220. to the declared object or function. Where an
  221. assembler name for an object or function is specified (see <a href="Asm-Labels.html#Asm-Labels">Asm Labels</a>), the attribute must follow the <code>asm</code>
  222. specification.
  223. </p>
  224. <p>An attribute specifier list may, in future, be permitted to appear after
  225. the declarator in a function definition (before any old-style parameter
  226. declarations or the function body).
  227. </p>
  228. <p>Attribute specifiers may be mixed with type qualifiers appearing inside
  229. the <code>[]</code> of a parameter array declarator, in the C99 construct by
  230. which such qualifiers are applied to the pointer to which the array is
  231. implicitly converted. Such attribute specifiers apply to the pointer,
  232. not to the array, but at present this is not implemented and they are
  233. ignored.
  234. </p>
  235. <p>An attribute specifier list may appear at the start of a nested
  236. declarator. At present, there are some limitations in this usage: the
  237. attributes correctly apply to the declarator, but for most individual
  238. attributes the semantics this implies are not implemented.
  239. When attribute specifiers follow the <code>*</code> of a pointer
  240. declarator, they may be mixed with any type qualifiers present.
  241. The following describes the formal semantics of this syntax. It makes the
  242. most sense if you are familiar with the formal specification of
  243. declarators in the ISO C standard.
  244. </p>
  245. <p>Consider (as in C99 subclause 6.7.5 paragraph 4) a declaration <code>T
  246. D1</code>, where <code>T</code> contains declaration specifiers that specify a type
  247. <var>Type</var> (such as <code>int</code>) and <code>D1</code> is a declarator that
  248. contains an identifier <var>ident</var>. The type specified for <var>ident</var>
  249. for derived declarators whose type does not include an attribute
  250. specifier is as in the ISO C standard.
  251. </p>
  252. <p>If <code>D1</code> has the form <code>( <var>attribute-specifier-list</var> D )</code>,
  253. and the declaration <code>T D</code> specifies the type
  254. &ldquo;<var>derived-declarator-type-list</var> <var>Type</var>&rdquo; for <var>ident</var>, then
  255. <code>T D1</code> specifies the type &ldquo;<var>derived-declarator-type-list</var>
  256. <var>attribute-specifier-list</var> <var>Type</var>&rdquo; for <var>ident</var>.
  257. </p>
  258. <p>If <code>D1</code> has the form <code>*
  259. <var>type-qualifier-and-attribute-specifier-list</var> D</code>, and the
  260. declaration <code>T D</code> specifies the type
  261. &ldquo;<var>derived-declarator-type-list</var> <var>Type</var>&rdquo; for <var>ident</var>, then
  262. <code>T D1</code> specifies the type &ldquo;<var>derived-declarator-type-list</var>
  263. <var>type-qualifier-and-attribute-specifier-list</var> pointer to <var>Type</var>&rdquo; for
  264. <var>ident</var>.
  265. </p>
  266. <p>For example,
  267. </p>
  268. <div class="smallexample">
  269. <pre class="smallexample">void (__attribute__((noreturn)) ****f) (void);
  270. </pre></div>
  271. <p>specifies the type &ldquo;pointer to pointer to pointer to pointer to
  272. non-returning function returning <code>void</code>&rdquo;. As another example,
  273. </p>
  274. <div class="smallexample">
  275. <pre class="smallexample">char *__attribute__((aligned(8))) *f;
  276. </pre></div>
  277. <p>specifies the type &ldquo;pointer to 8-byte-aligned pointer to <code>char</code>&rdquo;.
  278. Note again that this does not work with most attributes; for example,
  279. the usage of &lsquo;<samp>aligned</samp>&rsquo; and &lsquo;<samp>noreturn</samp>&rsquo; attributes given above
  280. is not yet supported.
  281. </p>
  282. <p>For compatibility with existing code written for compiler versions that
  283. did not implement attributes on nested declarators, some laxity is
  284. allowed in the placing of attributes. If an attribute that only applies
  285. to types is applied to a declaration, it is treated as applying to
  286. the type of that declaration. If an attribute that only applies to
  287. declarations is applied to the type of a declaration, it is treated
  288. as applying to that declaration; and, for compatibility with code
  289. placing the attributes immediately before the identifier declared, such
  290. an attribute applied to a function return type is treated as
  291. applying to the function type, and such an attribute applied to an array
  292. element type is treated as applying to the array type. If an
  293. attribute that only applies to function types is applied to a
  294. pointer-to-function type, it is treated as applying to the pointer
  295. target type; if such an attribute is applied to a function return type
  296. that is not a pointer-to-function type, it is treated as applying
  297. to the function type.
  298. </p>
  299. <hr>
  300. <div class="header">
  301. <p>
  302. Next: <a href="Function-Prototypes.html#Function-Prototypes" accesskey="n" rel="next">Function Prototypes</a>, Previous: <a href="Statement-Attributes.html#Statement-Attributes" accesskey="p" rel="prev">Statement Attributes</a>, Up: <a href="C-Extensions.html#C-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>
  303. </div>
  304. </body>
  305. </html>