【发布时间】:2018-10-26 20:14:18
【问题描述】:
我有以下来源,名为 lcd.c。
#include <stdio.h>
#include "lcd.h"
void print_mode(void)
{
printf("%d\n",LCD_MODE);
}
标题lcd.h 包含LCD_MODE 的定义,如下所示。
#ifndef LCD_H
#define LCD_H
#include "util.h"
#ifndef LCD_MODE
#define LCD_MODE LCD_MODE_8BIT
#endif
void print_mode(void);
#endif /* LCD_H */
文件util.h包含
#ifndef UTIL_H
#define UTIL_H
#define LCD_MODE_8BIT 1
#define LCD_MODE_4BIT 0
#endif /* UTIL_H */
lcd.c 将作为某些库的一部分单独编译。我想将它与应用程序main.c 一起使用,如下所示。
#include "util.h"
#define LCD_MODE LCD_MODE_4BIT
#include "lcd.h"
int main(void)
{
print_mode();
return 0;
}
期望的结果是根据main.c 中LCD_MODE_4BIT 的定义打印0。但是,打印1 是因为头文件看到LCD_MODE 在lcd.c 的预处理期间没有定义。我应该如何通过主应用程序将LCD_MODE 选项传递给print_mode()?
【问题讨论】:
-
你不能用
-DLCD_MODE=LCD_MODE_4BIT选项编译你的代码吗?如果没有,那你就卡住了。 -
如果您需要在不重新编译库的情况下对其进行配置,请不要使用宏。
-
您可以将选项作为参数传递:
void print_mode(int lcd_mode);。 -
@Jean-FrançoisFabre 理想情况下,我不想为每个用例重新编译
lcd.c(即我想将它作为一些更大的静态库的一部分)。所以我不能使用命令行定义。我想没有别的办法了…… -
预处理对
lcd.o中的值进行硬编码,所以是的,除非您创建set_mode方法,否则您会被卡住
标签: c linker c-preprocessor