Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Непонятная дирректива препроцессора


Автор: Solodov 23.3.2006, 18:32
В общем, данное встретил в демонстрационных файлах для микроконтроллера JN5121...

#ifdef GDB
void (** const rom_breakpoint_ptr)(void) = (void (**)(void))0xf0017004;
#endif

кто-нибудь подскажет что это такое и для чего надобно?

P.S. заранее благодарен. smile

Автор: _hunter 23.3.2006, 18:44
если я правильно понял -- по адресу 0xf0017004 берется функция rom_breakpoint_ptr

Автор: threef 23.3.2006, 18:45
Условная компиляция.
Если где-то раньше есть
#define GDB
, то эта строчка будет откомпилирована, иначе - считай закомментирована

Цитата

void (** const rom_breakpoint_ptr)(void) = (void (**)(void))0xf0017004;

Автор: kaa 7.10.2006, 19:04
threef, Извиняюсь что не создаю отдельного топика, просто вопрос практически тот же самый тока с уточнением: а если #define будет после #ifdef-а?
По вашим словам компилироваться не должно, а умя компилируется  smile 

Автор: Daevaorn 7.10.2006, 19:10
Цитата(kaa @  7.10.2006,  20:04 Найти цитируемый пост)
а если #define будет после #ifdef-а?

Не сработает, а значит в листинг не пойдет.
Цитата(kaa @  7.10.2006,  20:04 Найти цитируемый пост)
По вашим словам компилироваться не должно, а умя компилируется  

Значит где-то всё-таки дефайнится

Автор: kaa 7.10.2006, 23:41
Daevaorn, Так небывает:

Код

//application.h
//файл приложения
#ifndef application_h
#define application_h

//Структура содержащая переменные необходимые для работы приложения
struct application
{
    float *first_array;//Указатель для исходного массива
    float *second_array;//Указатель для массива обработанных чисел
    int m_quantity_numbers;//Количество чисел которое пользователь
                           //собирается ввести
    int m_max_value;//Максимальное значение числа заданное пользователем
    int quantity_changes;//Количество изменений  в процессе обработки
};

//Функция инициализации приложения.
//Устанавливает переменные приложения в ноль.
void InitApplication(application &app);


//Функция вызываемая перед завершением приложения
//Здесь - удаляет динамически созданные массивы.
void DestroyApplication(application &app);


//Функция ввода массива чисел.
//Принимает: структуру с переменными приложения.
//Выводит строку приветствия, строку приглашения к вводу для
//каждого значения, принимает значение количества символов которое
//пользователь собирается вводить, сами числа и максимальное значение
//числа с которым будут сравниваться остальные числа и заменяться на
//него если оно окажется меньше.
//В процессе работы формирует массив динамически и сохраняет его в
//структуре приложения.
void InputFunc(application &app);


//Функция обработки массива чисел.
//Принимает: структуру с переменными приложения.
//Функция сравнивает заданное введённое число с заданным максимальным
//и введённое если оно больше максимального. В процессе работы функция
//динамически создаёт массив для обработанного массива и сохраняет его в
//структуре приложения.
void ProcessingFunc(application &app);


//Функция вывода массива чисел.
//Функция принимает: структуру с переменными приложения.
void OutputFunc(application &app);


И ведь работает с таким файлом прога.  smile 

Автор: Damarus 7.10.2006, 23:58
Цитата(kaa @  7.10.2006,  20:04 Найти цитируемый пост)
 если #define будет после #ifdef-а?


Цитата(kaa @  8.10.2006,  00:41 Найти цитируемый пост)
Daevaorn, Так небывает:
//application.h
//файл приложения
#ifndef application_h
#define application_h

......


kaa, ты видишь разницу между #ifdef и #ifndef smile 

Автор: Dragon 8.10.2006, 12:59
#ifdef - if defined
#ifndef - if not defined

Вместо #ifdef можешь использовать #if defined(), например:
Код

#if defined(GDB)
#endif 

#if defined(_DEBUG) && defined(GDB)
#endif

#if !defined(_MEMORY_CHECKS)    // #ifndef
#endif


По поводу #define и #ifdef - стандартная вещь в хеадерах - macro guard:
Код

#ifndef _SOME_HEADER_H
#define _SOME_HEADER_H

// ...

#endif /* _SOME_HEADER_H */


Macro guard используется для того чтобы избежать повторного включения одного и того же заголовочного файла в код - и соответственных ошибок компиляции, вроде redefinition of a symbol.

Т.е. войти в секцию кода, ограниченную macro guard'ом можно только один раз, т.к. #ifndef при повторном проходе обнаружит, что _SOME_HEADER_H уже определено.

Автор: kaa 8.10.2006, 23:17
Damarus, Пардон, лажанулся, с макросами только вот недано столкнулся - в глазах о них ребит немного.  smile 


Dragon, Спасибо за объяснение.. У меня как раз вапрос на языке вертелся  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)