These are not reserved words but predefined macros when the compiler is running in a Linux / Unix environment.
At the command line, try the following command to list all of these macros:
gcc -dM < /dev/null
The two words linux and unix have the following definition:
gcc -dM < /dev/null | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
gcc -dM < /dev/null | grep unix
#define __unix__ 1
#define __unix 1
#define unix 1
The ANSI C standard of 1989 introduced rules that require that the name of a macro be started by two underscores or by an underscore followed by a small letter.
You can say that gcc, by default, "does not respect" these same rules, meaning that you can not do something like
int main() {
int unix = 10;
}
This will generate the following message:
error: expected identifier or '(' before numeric constant
int unix = 10;
As @pmg indicated in your reply, you can change this behavior using the options:
gcc -std=c90 -pedantic
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic