我有一个图书馆:
mylib
|__ device
|__ lcd.h
|__ lcd_config.h
|__ lcd.c
// File lcd.h
#include lcd_config.h
void function initLcd();
void function writeLcd();
// File lcd.c
#include lcd.h
void function writeLcd(){
// some code
}
// File lcd_config.h inside mylib
#ifndef lcd_config_H
#define lcd_config_H
#define TEST 10
#endif
我想在项目中使用库,但我想重新定义配置文件。
myproject
|__ lcd_config.h
|__ mylcd.c
|__ main.c
// File lcd_config.h inside myproject(at main.c level)
#ifndef lcd_config_H
#define lcd_config_H
#define TEST 20
#endif
// File mylcd.c
#include lcd.h
void function initLcd(){
printf("%d", TEST);
}
// File main.c
#include "device/lcd.h"
int main(void) {
initLcd(); // print 10
}
// File main1.c
#include "lcd_config.h"
#include "device/lcd.h"
int main(void) {
initLcd(); // print 10 too
}
在我的项目中,我希望TEST = 20,我该如何实现?
更新
现在看文件,这是我的真实案例。
要打印TEST = 20,我必须将#include lcd_config.h
放在#include lcd.h
mylcd.c
内。
如果我将它放在主文件中(如main1.c)10将打印,我认为预处理在mylcd.h之前看起来是main.c。
由于
答案 0 :(得分:6)
首先将定义TEST的标头包含在20中。请注意#ifndef
条件会阻止第二个标头实际执行任何操作,这就是为什么在您的情况下TEST的值仍为10。
更详细地说,下面的块表示“此标题只应包含在项目中一次”。如果在第一个头之后包含该头,则定义其中具有相同子句的第二个头将不会改变。
#ifndef lcd_config_H
#define lcd_config_H
...
#endif
我认为整个情况看起来很奇怪,但是不应该有太多标题具有完全相同的名称。