2015-09-11 2 views
1

У меня есть немного кода («core.h» ниже), который используется с несколькими различными обертками. Каждая из оберток требует, чтобы он имел массив разного размера. В настоящее время я использую #define в файле заголовка обертки, чтобы указать размер этого массива, но #define должен быть записан в файл до включения заголовка.Заставляет заказ/размещение #include плохой практики?

/*wrapper1.h*/ 
#define ARR_SIZE 42 // this must be written before- 
#include "core.h" // this to ensure correct operation 
//... 

/*wrapper2.h*/ 
#define ARR_SIZE 128 
#include "core.h" 
//... 

/*core.h*/ 
#ifndef ARR_SIZE 
#define ARR_SIZE 256 // default value 
#endif 
struct foo 
{ 
    char arr[ARR_SIZE]; 
    //... 
}; 
//... 

Это плохая практика? Если да, есть ли более приятный вариант?

ответ

1

Если wrapper1.h и wrapper2.h используются в одной программе (то есть, если у вас есть исходный файл #include s wrapper1.h, а другой - #include s wrapper2.h, то вы не можете использовать эти два источника файлы в одном проекте без значительной осторожности, чтобы избежать проблем - и большинство людей, занимающихся такими вещами, не так осторожны). Это нарушит одно правило определения (поскольку struct foo будет иметь более одного определения в вашей программе). Это вызывает неопределенное поведение в соответствии со стандартом C.

Если вы используете обертку # .h в разных проектах, проблем нет. Тем не менее, это ошибка, ожидающая, чтобы это произошло - например, что должно остановить вас с использованием wrapper1.h и wrapper2.h в том же проекте в будущем? Ничего, вот что. Результатом будут проблемы в вашей программе (в худшем случае, прерывистые ошибки времени выполнения), которые могут быть ОЧЕНЬ трудно отслеживать.

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

1

ИМХО, я бы рекомендовал не делать это, если это возможно. Я видел, как libs делали это так, и у него была головная боль, пытаясь найти, что случилось.

Несколько правил от MISRA поощряют вас не делать этого. Например, правило 3-1-1.

Смежные вопросы