Цель: #define, #include, #undef - PullRequest
       14

Цель: #define, #include, #undef

3 голосов
/ 02 декабря 2008

Какова будет цель этой конструкции в файле c ?:

#define _TIMERC  
#include "timer.h"  
#undef _TIMERC  

Мне известно о защите от многократного включения заголовочного файла. Похоже, это не то, что происходит.

спасибо!

Ответы [ 6 ]

5 голосов
/ 02 декабря 2008

Вот сценарий для иллюстрации ...

Допустим, timer.h предоставляет макрос tick_count (), который возвращает количество произошедших прерываний таймера.

Один модуль (rpm_reader.h), использующий таймер A для определения интервала времени:

#define _TIMERA   
#include "timer.h"   
#undef _TIMERA 

В другом модуле (lap_time.h) используется таймер C для его интервала времени

#define _TIMERC  
#include "timer.h"  
#undef _TIMERC  

rpm_reader возвращает счетчик тиков из таймера A, когда он вызывает tick_count (), а lap_time получает свой счет из таймера C.

(Мои извинения за то, что я ответил на свой вопрос, но задание вопроса помогло мне прийти к этому откровению.)

4 голосов
/ 02 декабря 2008

Часто заголовочный файл библиотеки имеет несколько опций, которые включаются и отключаются определениями макросов. Это включит такую ​​опцию.

Как правило, они устанавливаются в глобальном масштабе путем настройки системы сборки для добавления (например, с помощью gcc) -D_TIMERC в командную строку компиляторов.

2 голосов
/ 02 декабря 2008

Мне было интересно, может ли это быть так:

Заголовочный файл в этом случае предназначен для разрешения нескольких включений с различными определениями, установленными перед каждым # include.

Если в timer.h есть блок кода (код прерывания) для таймеров A, B и C для каждого таймера в микроконтроллере. В некоторых случаях таймер A требуется в одном модуле, а таймер C требуется в другом модуле.

1 голос
/ 02 декабря 2008

Я думаю, что ваш самооценка верна. Скорее всего, во включенном заголовке есть условный материал, и «вызывающий» файл знает, какой конкретный набор условных «вещей» он хочет включить.

Это не обязательно связано с несколькими включениями - это могут быть только особые случаи в зависимости от контекста «вызова».

Я не совсем уверен, почему кто-то определил бы все же. Я не могу вспомнить случай, когда я бы смешивал и сопоставлял, поэтому не уверен, почему необходимо неопределенное.

0 голосов
/ 02 декабря 2008

Для записи, обычной практикой для избежания многократного включения одного и того же заголовочного файла является установка защиты в самом файле, а не полагаться на какое-то внешнее определение ...

Заголовки начинаются с:

#ifndef header_name_h
#define header_name_h

и заканчивается:

#endif

Конечно, стиль определения может меняться.

Таким образом, при первом включении мы идем мимо #ifndef (еще не определено) и устанавливаем макрос. При втором включении, если оно есть, мы просто переходим в конец файла, ничего не включается.

0 голосов
/ 02 декабря 2008

С риском указать очевидное, "timer.h" ожидает наличия _TIMERC, а остальная часть вашего кода - нет.

Очевидно, что это не очень хорошая практика в общем случае, но я видел подобное, когда включал сторонний код. Может стать неприятным, когда у вас есть #defs, которые конфликтуют ...

...