Just yesterday, a question came into my mind:
When a C compiler preprocess the macro define?
So comes a test in Ubuntu 10.10
gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
// Header file
#ifndef TEST_H__
#define TEST_H__
#define and +
#endif
// Source file
#include "test.h"
#define ADD(X) (X and X)
void f() {
ADD(X);
return 0;
}
int main(int argc, char **argv) {
int i=20;
f(i);
return 0;
}
// end of source file
Using the -E option in GCC to preprocess the test.c, the result is
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
# 1 "test.h" 1
# 2 "test.c" 2
void f() {
(X and X);
return 0;
}
int main(int argc, char **argv) {
int i=20;
f(i);
return 0;
}
// End of the process
If we exchange the macro define (and) and (ADD) in header file and source file
we can get the following result after preprocessing.
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
# 1 "test.h" 1
# 2 "test.c" 2
void f() {
(X + X);
return 0;
}
int main(int argc, char **argv) {
int i=20;
f(i);
return 0;
}
// End of the process
When I defined all macro in two different header file,
the macro could expand correctly, whatever order the
header file.
So, I think an answer could come out:
We'd better define macro in header file.