Управляющая директива компилятора в файле из другого файла C

#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.