C,#include和#define覆盖

blo*_*low 1 c include

我有一个图书馆:

mylib
  |__ device
        |__ lcd.h
        |__ lcd_config.h
        |__ lcd.c
Run Code Online (Sandbox Code Playgroud)

.

// File lcd.h
#include lcd_config.h

void function initLcd();
void function writeLcd();
Run Code Online (Sandbox Code Playgroud)

.

// File lcd.c
#include lcd.h

void function writeLcd(){
     // some code
}
Run Code Online (Sandbox Code Playgroud)

.

// File lcd_config.h inside mylib
#ifndef lcd_config_H
#define lcd_config_H

#define TEST 10

#endif
Run Code Online (Sandbox Code Playgroud)

我想在项目中使用库,但我想重新定义配置文件.

myproject
    |__ lcd_config.h
    |__ mylcd.c
    |__ main.c
Run Code Online (Sandbox Code Playgroud)

.

// File lcd_config.h inside myproject(at main.c level)
#ifndef lcd_config_H
#define lcd_config_H

#define TEST 20

#endif
Run Code Online (Sandbox Code Playgroud)

.

// File mylcd.c
#include lcd.h

void function initLcd(){
     printf("%d", TEST);
}
Run Code Online (Sandbox Code Playgroud)

.

// File main.c
#include "device/lcd.h"

int main(void) {
    initLcd(); // print 10
}
Run Code Online (Sandbox Code Playgroud)

.

// File main1.c
#include "lcd_config.h"
#include "device/lcd.h"

int main(void) {
    initLcd(); // print 10 too
}
Run Code Online (Sandbox Code Playgroud)

在我的项目中,我希望TEST = 20,我怎样才能实现这一目标?

UPDATE

现在看文件,这是我的真实案例.

打印测试= 20我已经把#include lcd_config.h之前#include lcd.h里面mylcd.c.如果我把它放在主文件中(如main1.c)10将打印,si认为预处理在mylcd.h之前看看main.c.

谢谢

Qna*_*nan 6

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

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

#ifndef lcd_config_H
#define lcd_config_H
...
#endif
Run Code Online (Sandbox Code Playgroud)

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

  • @blow,是的,如果你没有包含任何直接将TEST定义到你的.c文件中的标题,那么结果将取决于编译事物的顺序.在任何情况下,我建议你重新考虑 - 如果绝对是一个不好的做法,有两个不同的标题和相同的`#ifndef`子句,因为*覆盖*库中的标题.作为替代,我建议在前面的例子中使用条件定义,以便在同一个程序中不可能有两个不同的`TEST`值. (2认同)