如何通过宏为 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.cLCD_MODE_4BIT 的定义打印 0。然而,1 被打印出来,因为 header 文件发现 LCD_MODElcd.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 宏,因为它解决不了任何问题并增加了混乱)