#c #compiler-directives
#c #компилятор-директивы
Вопрос:
Рассмотрим следующий файл заголовка,
// filename : packet_types.h
#ifndef _PACKET_TYPES_
#define _PACKET_TYPES_
struct Packet {
enum Type {
typ_ONE,
typ_TWO,
typ_THREE,
};
static const char * STRINGS[] = {
"ONE",
"TWO",
"THREE"
};
const char * getText( int enum ) {
return STRINGS[enum];
}
};
#endif
Поскольку Arduino имеет ограниченную память, я не хочу включать эту часть кода при включении этого файла packet_types.h,
static const char * STRINGS[] = {
"ONE",
"TWO",
"THREE"
};
const char * getText( int enum ) {
return STRINGS[enum];
}
Но для моего приложения с графическим интерфейсом мне нужен полный файл. Я хочу использовать один и тот же файл как для Arduino, так и для GUI, но как я могу добавить директиву компилятора #define, #ifdef, #ifndef… для выполнения этой работы, когда я включаю этот файл из какого-либо другого файла (main.cpp ). Спасибо.
Комментарии:
1. Неправильный выбор имени для заголовка защищает там. Любое имя (будь то макросы препроцессора, переменные, имена классов или функций или что-либо еще), начинающееся с подчеркивания, за которым следует заглавная буква, зарезервировано для реализации (как и любое имя, содержащее два последовательных подчеркивания, где угодно) и не должно использоваться в пользовательском коде.
Ответ №1:
Хотя можно использовать некоторые манипуляции с препроцессором, правильное решение — просто использовать C так, как он был предназначен для использования. Объявляйте только эти члены класса и методы в заголовочном файле:
static const char * STRINGS[];
const char * getText( int enum );
А затем определите их в одном из исходных файлов:
const char * Packet::STRINGS[] = {
"ONE",
"TWO",
"THREE"
};
const char * Packet::getText( int enum ) {
return STRINGS[enum];
}
При вышеупомянутом жонглировании препроцессором все, что в итоге получается, — это тот же логический результат, но более запутанным и обходным путем.
Комментарии:
1. Было бы здорово, если бы вы указали, как я могу это сделать, используя только директиву компилятора. Например
2. Просто поместите необходимые биты внутри
#ifdef
и определите символ только в одном из исходных файлов перед его#include
значением. Вы уже знаете, как использовать#ifndef
, так что вы уже знаете все, что вам нужно сделать.3. спасибо @sam, включение #define TEXT перед включением #include «packet_types.h» выполнило работу, в которую я вложил ненужный код в ТЕКСТ #ifdef … #endif.