Управление директивой компилятора в файле из другого файла Stack Overflow

Рассмотрим следующий заголовочный файл,

    // 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). Благодарю.

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];
}

С вышеупомянутым жонглированием препроцессора все, что он в конечном итоге завершает, — это тот же логический результат, но более запутанным и окольным путем.

3

Другие решения

Других решений пока нет …