use _ and __ in C programs [duplicate]

Here’s what the C standard says (section 7.1.3):

  • All identifiers that begin with an underscore and either an uppercase letter or another
    underscore are always reserved for any use.
  • All identifiers that begin with an underscore are always reserved for use as identifiers
    with file scope in both the ordinary and tag name spaces.

(The section goes on to list specific identifiers and sets of identifiers reserved by certain standard headers.)

What this means is that for example, the implementation (either the compiler or a standard header) can use the name __FOO for anything it likes. If you define that identifier in your own code, your program’s behavior is undefined. If you’re “lucky”, you’ll be using an implementation that doesn’t happen to define it, and your program will work as expected.

This means you simply should not define any such identifiers in your own code (unless your own code is part of a C implementation — and if you have to ask, it isn’t). There’s no need to define such identifiers anyway; there’s hardly any shortage of unreserved identifiers.

You can use an identifier like _foo as long as it’s defined locally (not at file scope) — but personally I find it much easier just to avoid using leading underscores at all.

Incidentally, your example of _sqrt doesn’t necessarily illustrate the point. An implementation may define the name _sqrt in <math.h> (since anything defined there is at file scope), but there’s no particular reason to expect that it will do so. When I compile your program, I get a warning:

c.c:7:1: warning: implicit declaration of function ‘_sqrt’ [-Wimplicit-function-declaration]

because <math.h> on my system doesn’t define that identifier, and a link-time fatal error:

/tmp/cc1ixRmL.o: In function `main':
c.c:(.text+0x1a): undefined reference to `_sqrt'

because there’s no such symbol in the library.

Leave a Comment