Hello,
NuttX public headers define some plain names (not reserved for the
implementation) in every program that includes them. A valid C program
that uses one of these names as its own identifier does not compile on
NuttX.
The names:
- <sys/types.h>: OK and ERROR (enum constants).
- <errno.h>: set_errno() and get_errno() (macros).
- <nuttx/compiler.h>, which almost every public header includes: CODE,
FAR, NEAR, DSEG, IPTR, IOBJ, EXTERN, UNUSED, PRAGMA, and many
lowercase macros (88 across its compiler sections), for example
object_size(), weak_alias(), visibility_hidden, visibility_default,
builtin_function(), inline_function, printf_like(),
begin_packed_struct, return_address.
Examples that are valid C but fail on NuttX:
#include <stdio.h>
enum result { FAIL, OK }; /* 'OK' conflicts with a previous
declaration */
static int CODE = 3; /* CODE expands to nothing */
enum vis { visibility_hidden }; /* expands to __attribute__((...)) */
size_t object_size(void *p); /* macro needs 2 arguments */
static void set_errno(int e); /* expands as the errno.h macro */
The NuttX tree and nuttx-apps use these names a lot (in apps: OK 2802
times, ERROR 4504, FAR 17824), so a plain rename is not practical.
Possible directions:
1. A per-program opt-out: when a program defines a macro (for example
NUTTX_NO_EXTENSION_NAMES, or when it asks for a strict standard
namespace with _POSIX_C_SOURCE/_XOPEN_SOURCE and __STRICT_ANSI__), the
public headers use reserved spellings internally and do not define the
plain names. Nothing changes for existing code.
2. A Kconfig option, default y, to keep the plain names; with it off,
the public headers define only reserved names. NuttX and nuttx-apps
would continue to get the plain names from an internal header.
3. Keep the names, and document them as reserved on NuttX.
Today I work around it in ported programs with a forced-include header
that #undef the names after the system headers. That cannot fix
OK/ERROR, which are enum constants.
Which direction is acceptable? I can do the work for 1 or 2.
Thanks,
Marco Casaroli