1

我有一个这样的图书馆:

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.hbefore #include lcd.hinside mylcd.c。如果我把它放在主文件中(如 main1.c) 10 将被打印,我认为预处理在 mylcd.h 之前查看 main.c。

谢谢

4

1 回答 1

7

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

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

#ifndef lcd_config_H
#define lcd_config_H
...
#endif

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

于 2012-08-19T11:37:28.310 回答