In Keil demos, I find some definitions such as "#ifndef __C51__", what's the meaning for double '_'.
As opposed to Pascal language, C language suffers from the lack of name spaces. There is no way in to import resources from a module in C/C++, the file is included as a whole. As a result, if you include modules A and B, whereas module B uses module A, you have a redifinitions and other conflicts. In other words, the global scope is a big mess. #ifndefs in H files solve this problem paritally. Returning to example, module A is included only once wrapped into #ifndef condition. It is widely adopted in C programming to use module names as identificators with double subscribts. For example, #ifndef __moduleA_H__ #define __moduleA_H__ // this H file will be included only once //definitions here #endif
Pascal has just as little namespace protection as C, unless I remember some things very incorrectly. As to the "code uses module B, which in turn needs module A" scenario: you're wrong. Properly written C headers can very well #include other headers, without causing any double definition problems, for two reasons: 1) Multiple inclusion guards, as you mention. 2) There should never be any definition in a header file, to begin with, and thus it can't collide with any in some other header file. Only declarations go on there. And no, names starting with double _ are *not* correct C. If they're widely adopted, that would make them a very common error. Your own code (unless you're a compiler or runtime library implementor) should use
#ifndef MYPROGRAM_FILE_H #define MYPROGRAM_FILE_H // all actual declarations in here.. #endif
we have strayed from the original question... "2) There should never be any definition in a header file" Just to clarify, that means code or data definitions; type definitions and preprocessor #defines are good in headers.
View all questions in Keil forum