如何通过宏为 C 库提供选项
How to provide an option to a C library via a macro
我有以下来源名为 lcd.c
。
#include <stdio.h>
#include "lcd.h"
void print_mode(void)
{
printf("%d\n",LCD_MODE);
}
header 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
被打印出来,因为 header 文件发现 LCD_MODE
在 lcd.c
的预处理过程中没有定义。我应该如何通过主应用程序将 LCD_MODE
选项传递给 print_mode()
?
如果您不能重新编译 lcd.c
您就不能在另一个源文件中使用宏,因为 lcd.o
已经硬编码了该值。
您可以创建一个静态变量(默认为 LCD_MODE
),您可以使用 setter:
更改该变量
#include <stdio.h>
#include "lcd.h"
static int the_mode = LCD_MODE;
void print_mode(void)
{
printf("%d\n",the_mode);
}
void set_mode(int new_mode)
{
the_mode = new_mode;
}
lcd.h
应该包含新配置函数的原型 BTW:
void set_mode(int new_mode);
那么在你的 main 中,你可以:
set_mode(LCD_MODE);
(或者在任何地方删除 LCD_MODE
宏,因为它解决不了任何问题并增加了混乱)
我有以下来源名为 lcd.c
。
#include <stdio.h>
#include "lcd.h"
void print_mode(void)
{
printf("%d\n",LCD_MODE);
}
header 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
被打印出来,因为 header 文件发现 LCD_MODE
在 lcd.c
的预处理过程中没有定义。我应该如何通过主应用程序将 LCD_MODE
选项传递给 print_mode()
?
如果您不能重新编译 lcd.c
您就不能在另一个源文件中使用宏,因为 lcd.o
已经硬编码了该值。
您可以创建一个静态变量(默认为 LCD_MODE
),您可以使用 setter:
#include <stdio.h>
#include "lcd.h"
static int the_mode = LCD_MODE;
void print_mode(void)
{
printf("%d\n",the_mode);
}
void set_mode(int new_mode)
{
the_mode = new_mode;
}
lcd.h
应该包含新配置函数的原型 BTW:
void set_mode(int new_mode);
那么在你的 main 中,你可以:
set_mode(LCD_MODE);
(或者在任何地方删除 LCD_MODE
宏,因为它解决不了任何问题并增加了混乱)