Повторное использование макроса C в нескольких файлах - PullRequest
5 голосов
/ 06 марта 2012

У меня есть несколько часто используемых макросов, которые повсеместно необходимы почти в каждом C-файле, который я пишу. В настоящее время я копирую их в каждый файл, в котором они мне нужны. Вероятно, это плохая идея, потому что в конечном итоге мне понадобится изменить один из них, и в результате я получу непоследовательно определенные макросы между файлами.

Есть ли способ создать заголовочный файл для макросов? Я попытался создать заголовок со всеми моими макросами и включить его, но я все еще получаю предупреждения компилятора.

UPDATE: Конкретные предупреждения, которые я получаю, являются неявными объявлениями функций, таких как V4, из второго примера.

Пример:

//file1.c
#define COMMON_NUMBER 1

//file2.c
#define COMMON_NUMBER 1

//...

//fileN.c
#define COMMON_NUMBER 1

//Oh wait, it should have been 2 all along..... *facepalm*

Лучший пример:

//file1.c
#include "usefulmacros.h"

char* prog;
int optv;

int main(){
  prog = strdup(argv[0]);    
  optv = 4;           // This would be parsed from # of "-v" in argv[]
  return 0;
}

void functionA(){
  int dumberror = 1;
  V4("This is a fairly verbose error: %d",dumberror);
}

//file2.c
#include "usefulemacros.h"
extern char* prog;
extern int   optv;

void functionB(){
  int differror = 2;
  V4("This is a different error: %d",differror);
}

//usefulmacros.h
#ifndef USEFULMACROS
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);}
#endif

Ответы [ 4 ]

7 голосов
/ 06 марта 2012
#ifndef COMMON_INCLUDE_FILE
#define COMMON_INCLUDE_FILE

#define COMMON_NUMBER 1
#define OTHER_COMMON 2

#endif

В C, где макросы немного более распространены, чем в C ++, где вы захотите сделать это со статическим глобалом, вышеуказанный механизм довольно распространен.Вы добавляете include guard вокруг тела файла и определяете свои общие ресурсы там ... По сути, это то, чем config.h в конечном итоге оказывается с autoconf .. Так что никто не может сказать, что это не стандартный механизм для кода C.

Просто включите common.h в любые файлы, которые в этом нуждаются, сделка сделана.

2 голосов
/ 06 марта 2012

Вы должны определенно поместить ваши общие макросы в один заголовок для всего вашего проекта: дублирование кода - опасная вещь, которая заставляет ваши расходы на техническое обслуживание идти вверх.

Предупреждения, которые вы видите, могут иметь отношение к включению одного и того же заголовка несколько раз. Вы должны использовать , включая охранников , чтобы избежать их.

РЕДАКТИРОВАТЬ (в ответ на обновление вопроса)

Ваша реализация include guard отсутствует #define USEFULMACROS. Должно быть так:

//usefulmacros.h
#ifndef USEFULMACROS
#define USEFULMACROS
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);}
#endif
0 голосов
/ 06 марта 2012

Вы проверяете определение макроса USEFULMACROS с помощью #ifndef, но нигде не определяете его.

Вы должны добавить строку

#define USEFULMACROS

после

#ifndef USEFULMACROS
0 голосов
/ 06 марта 2012

То, что вы описываете, это способ сделать это.Какое предупреждение?Если это множественное определение, вы просто хотите защитить файл, как описано в ответе на этот вопрос: При использовании #ifndef файл .h добавляется несколько раз

...