mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
docs: Explain the desired position of function attributes
While discussing how to format the addition of various function attributes, some "unwritten rules" of ordering surfaced[1]. Capture as close as possible to Linus's preferences for future reference. (Though I note the dissent voiced by Joe Perches, Alexey Dobriyan, and others that would prefer all attributes live on a separate leading line.) [1] https://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com/ Signed-off-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20211005152611.4120605-1-keescook@chromium.org Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
parent
7275423c17
commit
d5b421fe02
@ -480,13 +480,48 @@ closing function brace line. E.g.:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(system_is_up);
|
EXPORT_SYMBOL(system_is_up);
|
||||||
|
|
||||||
|
6.1) Function prototypes
|
||||||
|
************************
|
||||||
|
|
||||||
In function prototypes, include parameter names with their data types.
|
In function prototypes, include parameter names with their data types.
|
||||||
Although this is not required by the C language, it is preferred in Linux
|
Although this is not required by the C language, it is preferred in Linux
|
||||||
because it is a simple way to add valuable information for the reader.
|
because it is a simple way to add valuable information for the reader.
|
||||||
|
|
||||||
Do not use the ``extern`` keyword with function prototypes as this makes
|
Do not use the ``extern`` keyword with function declarations as this makes
|
||||||
lines longer and isn't strictly necessary.
|
lines longer and isn't strictly necessary.
|
||||||
|
|
||||||
|
When writing function prototypes, please keep the `order of elements regular
|
||||||
|
<https://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com/>`_.
|
||||||
|
For example, using this function declaration example::
|
||||||
|
|
||||||
|
__init void * __must_check action(enum magic value, size_t size, u8 count,
|
||||||
|
char *fmt, ...) __printf(4, 5) __malloc;
|
||||||
|
|
||||||
|
The preferred order of elements for a function prototype is:
|
||||||
|
|
||||||
|
- storage class (below, ``static __always_inline``, noting that ``__always_inline``
|
||||||
|
is technically an attribute but is treated like ``inline``)
|
||||||
|
- storage class attributes (here, ``__init`` -- i.e. section declarations, but also
|
||||||
|
things like ``__cold``)
|
||||||
|
- return type (here, ``void *``)
|
||||||
|
- return type attributes (here, ``__must_check``)
|
||||||
|
- function name (here, ``action``)
|
||||||
|
- function parameters (here, ``(enum magic value, size_t size, u8 count, char *fmt, ...)``,
|
||||||
|
noting that parameter names should always be included)
|
||||||
|
- function parameter attributes (here, ``__printf(4, 5)``)
|
||||||
|
- function behavior attributes (here, ``__malloc``)
|
||||||
|
|
||||||
|
Note that for a function **definition** (i.e. the actual function body),
|
||||||
|
the compiler does not allow function parameter attributes after the
|
||||||
|
function parameters. In these cases, they should go after the storage
|
||||||
|
class attributes (e.g. note the changed position of ``__printf(4, 5)``
|
||||||
|
below, compared to the **declaration** example above)::
|
||||||
|
|
||||||
|
static __always_inline __init __printf(4, 5) void * __must_check action(enum magic value,
|
||||||
|
size_t size, u8 count, char *fmt, ...) __malloc
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
7) Centralized exiting of functions
|
7) Centralized exiting of functions
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user