C,#include和#define覆盖

时间:2012-08-19 11:32:26

标签: c include

我有一个图书馆:

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。

由于

1 个答案:

答案 0 :(得分:6)

首先将定义TEST的标头包含在20中。请注意#ifndef条件会阻止第二个标头实际执行任何操作,这就是为什么在您的情况下TEST的值仍为10。

更详细地说,下面的块表示“此标题只应包含在项目中一次”。如果在第一个头之后包含该头,则定义其中具有相同子句的第二个头将不会改变。

#ifndef lcd_config_H
#define lcd_config_H
...
#endif

我认为整个情况看起来很奇怪,但是不应该有太多标题具有完全相同的名称。