📄 attribute-syntax.html
字号:
<html lang="en"><head><title>Using the GNU Compiler Collection (GCC)</title><meta http-equiv="Content-Type" content="text/html"><meta name="description" content="Using the GNU Compiler Collection (GCC)"><meta name="generator" content="makeinfo 4.6"><!--Copyright © 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. <p>Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.2 orany later version published by the Free Software Foundation; with theInvariant Sections being "GNU General Public License" and "FundingFree Software", the Front-Cover texts being (a) (see below), and withthe Back-Cover Texts being (b) (see below). A copy of the license isincluded in the section entitled "GNU Free Documentation License". <p>(a) The FSF's Front-Cover Text is: <p>A GNU Manual <p>(b) The FSF's Back-Cover Text is: <p>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.--><meta http-equiv="Content-Style-Type" content="text/css"><style type="text/css"><!-- pre.display { font-family:inherit } pre.format { font-family:inherit } pre.smalldisplay { font-family:inherit; font-size:smaller } pre.smallformat { font-family:inherit; font-size:smaller } pre.smallexample { font-size:smaller } pre.smalllisp { font-size:smaller }--></style></head><body><div class="node"><p>Node: <a name="Attribute%20Syntax">Attribute Syntax</a>,Next: <a rel="next" accesskey="n" href="Function-Prototypes.html#Function%20Prototypes">Function Prototypes</a>,Previous: <a rel="previous" accesskey="p" href="Function-Attributes.html#Function%20Attributes">Function Attributes</a>,Up: <a rel="up" accesskey="u" href="C-Extensions.html#C%20Extensions">C Extensions</a><hr><br></div><h3 class="section">Attribute Syntax</h3><p>This section describes the syntax with which <code>__attribute__</code> may beused, and the constructs to which attribute specifiers bind, for the Clanguage. Some details may vary for C++ and Objective-C. Because ofinfelicities in the grammar for attributes, some forms described heremay not be successfully parsed in all cases. <p>There are some problems with the semantics of attributes in C++. Forexample, there are no manglings for attributes, although they may affectcode generation, so problems may arise when attributed types are used inconjunction with templates or overloading. Similarly, <code>typeid</code>does not distinguish between types with different attributes. Supportfor attributes in C++ may be restricted in future to attributes ondeclarations only, but not on nested declarators. <p>See <a href="Function-Attributes.html#Function%20Attributes">Function Attributes</a>, for details of the semantics of attributesapplying to functions. See <a href="Variable-Attributes.html#Variable%20Attributes">Variable Attributes</a>, for details of thesemantics of attributes applying to variables. See <a href="Type-Attributes.html#Type%20Attributes">Type Attributes</a>,for details of the semantics of attributes applying to structure, unionand enumerated types. <p>An <dfn>attribute specifier</dfn> is of the form<code>__attribute__ ((</code><var>attribute-list</var><code>))</code>. An <dfn>attribute list</dfn>is a possibly empty comma-separated sequence of <dfn>attributes</dfn>, whereeach attribute is one of the following: <ul><li>Empty. Empty attributes are ignored. <li>A word (which may be an identifier such as <code>unused</code>, or a reservedword such as <code>const</code>). <li>A word, followed by, in parentheses, parameters for the attribute. These parameters take one of the following forms: <ul><li>An identifier. For example, <code>mode</code> attributes use this form. <li>An identifier followed by a comma and a non-empty comma-separated listof expressions. For example, <code>format</code> attributes use this form. <li>A possibly empty comma-separated list of expressions. For example,<code>format_arg</code> attributes use this form with the list being a singleinteger constant expression, and <code>alias</code> attributes use this formwith the list being a single string constant. </ul> </ul> <p>An <dfn>attribute specifier list</dfn> is a sequence of one or more attributespecifiers, not separated by any other tokens. <p>In GNU C, an attribute specifier list may appear after the colon following alabel, other than a <code>case</code> or <code>default</code> label. The onlyattribute it makes sense to use after a label is <code>unused</code>. Thisfeature is intended for code generated by programs which contains labelsthat may be unused but which is compiled with <code>-Wall</code>. It wouldnot normally be appropriate to use in it human-written code, though itcould be useful in cases where the code that jumps to the label iscontained within an <code>#ifdef</code> conditional. GNU C++ does not permitsuch placement of attribute lists, as it is permissible for adeclaration, which could begin with an attribute list, to be labelled inC++. Declarations cannot be labelled in C90 or C99, so the ambiguitydoes not arise there. <p>An attribute specifier list may appear as part of a <code>struct</code>,<code>union</code> or <code>enum</code> specifier. It may go either immediatelyafter the <code>struct</code>, <code>union</code> or <code>enum</code> keyword, or afterthe closing brace. It is ignored if the content of the structure, unionor enumerated type is not defined in the specifier in which theattribute specifier list is used--that is, in usages such as<code>struct __attribute__((foo)) bar</code> with no following opening brace. Where attribute specifiers follow the closing brace, they are consideredto relate to the structure, union or enumerated type defined, not to anyenclosing declaration the type specifier appears in, and the typedefined is not complete until after the attribute specifiers. <p>Otherwise, an attribute specifier appears as part of a declaration,counting declarations of unnamed parameters and type names, and relatesto that declaration (which may be nested in another declaration, forexample in the case of a parameter declaration), or to a particular declaratorwithin a declaration. Where anattribute specifier is applied to a parameter declared as a function oran array, it should apply to the function or array rather than thepointer to which the parameter is implicitly converted, but this is notyet correctly implemented. <p>Any list of specifiers and qualifiers at the start of a declaration maycontain attribute specifiers, whether or not such a list may in thatcontext contain storage class specifiers. (Some attributes, however,are essentially in the nature of storage class specifiers, and only makesense where storage class specifiers may be used; for example,<code>section</code>.) There is one necessary limitation to this syntax: thefirst old-style parameter declaration in a function definition cannotbegin with an attribute specifier, because such an attribute applies tothe function instead by syntax described below (which, however, is notyet implemented in this case). In some other cases, attributespecifiers are permitted by this grammar but not yet supported by thecompiler. All attribute specifiers in this place relate to thedeclaration as a whole. In the obsolescent usage where a type of<code>int</code> is implied by the absence of type specifiers, such a list ofspecifiers and qualifiers may be an attribute specifier list with noother specifiers or qualifiers. <p>An attribute specifier list may appear immediately before a declarator(other than the first) in a comma-separated list of declarators in adeclaration of more than one identifier using a single list ofspecifiers and qualifiers. Such attribute specifiers applyonly to the identifier before whose declarator they appear. Forexample, in<pre class="smallexample"> __attribute__((noreturn)) void d0 (void), __attribute__((format(printf, 1, 2))) d1 (const char *, ...), d2 (void) </pre><p>the <code>noreturn</code> attribute applies to all the functionsdeclared; the <code>format</code> attribute only applies to <code>d1</code>. <p>An attribute specifier list may appear immediately before the comma,<code>=</code> or semicolon terminating the declaration of an identifier otherthan a function definition. At present, such attribute specifiers applyto the declared object or function, but in future they may attach to theoutermost adjacent declarator. In simple cases there is no difference,but, for example, in<pre class="smallexample"> void (****f)(void) __attribute__((noreturn)); </pre><p>at present the <code>noreturn</code> attribute applies to <code>f</code>, whichcauses a warning since <code>f</code> is not a function, but in future it mayapply to the function <code>****f</code>. The precise semantics of whatattributes in such cases will apply to are not yet specified. Where anassembler name for an object or function is specified (see <a href="Asm-Labels.html#Asm%20Labels">Asm Labels</a>), at present the attribute must follow the <code>asm</code>specification; in future, attributes before the <code>asm</code> specificationmay apply to the adjacent declarator, and those after it to the declaredobject or function. <p>An attribute specifier list may, in future, be permitted to appear afterthe declarator in a function definition (before any old-style parameterdeclarations or the function body). <p>Attribute specifiers may be mixed with type qualifiers appearing insidethe <code>[]</code> of a parameter array declarator, in the C99 construct bywhich such qualifiers are applied to the pointer to which the array isimplicitly converted. Such attribute specifiers apply to the pointer,not to the array, but at present this is not implemented and they areignored. <p>An attribute specifier list may appear at the start of a nesteddeclarator. At present, there are some limitations in this usage: theattributes correctly apply to the declarator, but for most individualattributes the semantics this implies are not implemented. When attribute specifiers follow the <code>*</code> of a pointerdeclarator, they may be mixed with any type qualifiers present. The following describes the formal semantics of this syntax. It will make themost sense if you are familiar with the formal specification ofdeclarators in the ISO C standard. <p>Consider (as in C99 subclause 6.7.5 paragraph 4) a declaration <code>TD1</code>, where <code>T</code> contains declaration specifiers that specify a type<var>Type</var> (such as <code>int</code>) and <code>D1</code> is a declarator thatcontains an identifier <var>ident</var>. The type specified for <var>ident</var>for derived declarators whose type does not include an attributespecifier is as in the ISO C standard. <p>If <code>D1</code> has the form <code>( </code><var>attribute-specifier-list</var><code> D )</code>,and the declaration <code>T D</code> specifies the type"<var>derived-declarator-type-list</var> <var>Type</var>" for <var>ident</var>, then<code>T D1</code> specifies the type "<var>derived-declarator-type-list</var><var>attribute-specifier-list</var> <var>Type</var>" for <var>ident</var>. <p>If <code>D1</code> has the form <code>*</code><var>type-qualifier-and-attribute-specifier-list</var><code> D</code>, and thedeclaration <code>T D</code> specifies the type"<var>derived-declarator-type-list</var> <var>Type</var>" for <var>ident</var>, then<code>T D1</code> specifies the type "<var>derived-declarator-type-list</var><var>type-qualifier-and-attribute-specifier-list</var> <var>Type</var>" for<var>ident</var>. <p>For example,<pre class="smallexample"> void (__attribute__((noreturn)) ****f) (void); </pre><p>specifies the type "pointer to pointer to pointer to pointer tonon-returning function returning <code>void</code>". As another example,<pre class="smallexample"> char *__attribute__((aligned(8))) *f; </pre><p>specifies the type "pointer to 8-byte-aligned pointer to <code>char</code>". Note again that this does not work with most attributes; for example,the usage of <code>aligned</code> and <code>noreturn</code> attributes given aboveis not yet supported. <p>For compatibility with existing code written for compiler versions thatdid not implement attributes on nested declarators, some laxity isallowed in the placing of attributes. If an attribute that only appliesto types is applied to a declaration, it will be treated as applying tothe type of that declaration. If an attribute that only applies todeclarations is applied to the type of a declaration, it will be treatedas applying to that declaration; and, for compatibility with codeplacing the attributes immediately before the identifier declared, suchan attribute applied to a function return type will be treated asapplying to the function type, and such an attribute applied to an arrayelement type will be treated as applying to the array type. If anattribute that only applies to function types is applied to apointer-to-function type, it will be treated as applying to the pointertarget type; if such an attribute is applied to a function return typethat is not a pointer-to-function type, it will be treated as applyingto the function type. </body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -