summaryrefslogtreecommitdiff
path: root/doc/c-extensions
blob: e1b222b9fc79cca66e38c5818937b8e3e46a538e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Use of extensions throughout the X server tree
----------------------------------------------

Optional extensions:
The server will still build if your toolchain does not support these
extensions, although the results may not be optimal.

    * _X_SENTINEL(x): member x of the passed structure must be NULL, e.g.:
                      void parseOptions(Option *options _X_SENTINEL(0));
                      parseOptions("foo", "bar", NULL); /* this is OK */
                      parseOptions("foo", "bar", "baz"); /* this is not */
                      This definition comes from Xfuncproto.h in the core
                      protocol headers.
    * _X_ATTRIBUTE_PRINTF(x, y): This function has printf-like semantics;
                                 check the format string when built with
                                 -Wformat (gcc) or similar.
    * _X_EXPORT: this function should appear in symbol tables.
    * _X_HIDDEN: this function should not appear in the _dynamic_ symbol
                 table.
    * _X_INTERNAL: like _X_HIDDEN, but attempt to ensure that this function
                   is never called from another module.
    * _X_INLINE: inline this functon if possible (generally obeyed unless
                 disabling optimisations).
    * _X_DEPRECATED: warn on use of this function.

Mandatory extensions:
The server will not build if your toolchain does not support these extensions.

    * named initialisers: explicitly initialising structure members, e.g.:
                          struct foo bar = { .baz = quux, .brian = "dog" };
    * variadic macros: macros with a variable number of arguments, e.g.:
                       #define DebugF(x, ...) /**/
    * interleaved code and declarations: { foo = TRUE; int bar; do_stuff(); }