Как предоставить опцию для библиотеки C через макрос - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующий источник с именем 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;
}

Желаемый результат - вывести 0 согласно определению LCD_MODE_4BIT в main.c.Тем не менее, 1 печатается, потому что заголовочный файл видит, что LCD_MODE не определен во время предварительной обработки для lcd.c.Как мне передать параметр LCD_MODE в print_mode() через основное приложение?

1 Ответ

0 голосов
/ 26 октября 2018

если вы не можете перекомпилировать lcd.c, вы не можете использовать макрос в другом исходном файле, потому что lcd.o уже имеет значение в жестком коде.

Вы можете создать статическую переменную (по умолчанию LCD_MODE), которую вы можете изменить с помощью установщика:

#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);

тогда в своей главной вы можете:

set_mode(LCD_MODE);

(или бросьте этот макрос LCD_MODE везде, потому что он ничего не решает и не добавляет путаницы)

...