Рассмотрим следующий заголовочный файл,
// 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 имеет ограниченную память, я не хочу включать эту часть кода, когда я включаю этот файл, package_types.h,
static const char * STRINGS[] = {
"ONE",
"TWO",
"THREE"};
const char * getText( int enum ) {
return STRINGS[enum];
}
Но для моего приложения с графическим интерфейсом я хочу полный файл. Я хочу использовать один и тот же файл для Arduino и GUI, но как я могу добавить директиву компилятора # define, # ifdef, #ifndef … для выполнения этой работы, когда я включаю этот файл из какого-то другого файла (main.cpp). Благодарю.
Хотя возможно использование некоторого препроцессорного жонглирования, правильное решение состоит в том, чтобы просто использовать 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];
}
С вышеупомянутым жонглированием препроцессора все, что он в конечном итоге завершает, — это тот же логический результат, но более запутанным и окольным путем.
Других решений пока нет …