Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
619 / 513 / 101
Регистрация: 27.01.2015
Сообщений: 2,979
Записей в блоге: 1
Завершенные тесты: 1
#1

Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? - C++

13.07.2015, 17:58. Просмотров 776. Ответов 22
Метки нет (Все метки)

Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 17:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? (C++):

Программа работы с директивами препроцессора - C++
Задать константы M и N и вычислить (aM + bN ) / MN Ввести два вещественных значения и вывести их синусы на экран

Задачи для написания программ - C++
Изучаю с++ в течение месяца: знаком с функциями, указателями, ссылками, классами, циклами, if, чуть-чуть с массивами и чуть-чуть с...

Как правильно организовать рабочее окружение для написания и проверки программ для PDP-11 под Linux? - Assembler
Мне предстоит писать программы для системы PDP-11 (если что, я пока даже не в курсе, что это точно такое), а также проверять их работу...

Приходится часто перегружать FireBird - Firebird/InterBase
При выборе FireBird в качестве сервера тестирование показало хорошие результаты. Но тогда база была только в начале своего пути. Теперь ее...

ПО для написания программ на Java. - Java
Какое программное обеспечение нужно иметь у себя на компе, чтоб написать Веб-приложение на Java? В литературе указывается какой-то...

Часто приходится вводить логин и пароль - Сети
Часто приходится вводить логин и пароль для входа в админку модема. Искал в настройках, но не нашёл, где регулируется время. Кажется...

22
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
13.07.2015, 18:00 #2
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
Если вы про макросы, то как можно реже: 16. Избегайте макросов
А вообще сильно зависит от области применения.
0
Ferrari F1
619 / 513 / 101
Регистрация: 27.01.2015
Сообщений: 2,979
Записей в блоге: 1
Завершенные тесты: 1
13.07.2015, 18:05  [ТС] #3
Avazart, а если говорить про директивы прагма или лайн? нужно ли сосредотачивать на их изучении внимание? или ими, в основном, не пользуются?
0
MicM
822 / 480 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
13.07.2015, 18:10 #4
Ну #include явно придется использовать.
При написании собственных заголовочных файлов, например:
C++
1
2
3
4
#ifndef ABC
#define ABC
// ...
#endif
0
Renji
1968 / 1366 / 308
Регистрация: 05.06.2014
Сообщений: 3,898
13.07.2015, 18:24 #5
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
Когда надо сократить однотипный код. Ну, что-то типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class my_class
{
    //инициализирует объект в момент первого обращения
    void lazy_init();
public:
    int value1()const{
        lazy_init();
        return _value1;
    }
private:
    int _value1;
public:
    int value2()const{
        lazy_init();
        return _value2;
    }
private:
    int _value2;
    //а этот хитрый макрос и объявляет метод как выше,
    //и объявляет int _value3
    lazy_init_value(int,value3)
};
0
hoggy
6697 / 2879 / 494
Регистрация: 15.11.2014
Сообщений: 6,478
Завершенные тесты: 1
13.07.2015, 18:28 #6
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
постоянно.
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,068
Завершенные тесты: 1
13.07.2015, 18:30 #7
Цитата Сообщение от hoggy Посмотреть сообщение
постоянно
главное чтобы "дебажить" потом не пришлось трехуровневый Define
0
SEGNET
65 / 65 / 9
Регистрация: 28.12.2012
Сообщений: 495
13.07.2015, 18:34 #8
Проект написанный для разных платформ, явно использует большое количество инструкций препроцессора.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
13.07.2015, 18:41 #9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Avazart, а если говорить про директивы прагма или лайн? нужно ли сосредотачивать на их изучении внимание? или ими, в основном, не пользуются?
А что о них говорить. Ясное дело не плохо бы о них знать, но использовать - по минимуму.
0
hoggy
6697 / 2879 / 494
Регистрация: 15.11.2014
Сообщений: 6,478
Завершенные тесты: 1
13.07.2015, 18:47 #10
Цитата Сообщение от Raali Посмотреть сообщение
главное чтобы "дебажить" потом не пришлось трехуровневый Define
1.
диррективны препроцессора - это не только декларации макросов.
сюда входят #include и компания.

так что, полагаю,
вы, как и я, постоянно используете препроцессор.

2.
макросы не подлежат отладке.
(они не должны делать нагрузку на сопровождение.
в противном случае их использование - нерентабельно).

3.
я пока ещё не встречал особых сложностей.
ну может быть за искл. изысков буст-препроцессора.
обычные, бытовые макросы особых затруднений не вызывают.

4.
разумеется, если задача решается и без макросов,
то нет ни одной причины их использовать.
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,641
Записей в блоге: 28
13.07.2015, 20:35 #11
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
а если говорить про директивы прагма или лайн?
#pragma НЕ является директивой препроцессора. А #line никакой полезной нагрузки не несёт, его и изучать-то не надо
0
hoggy
6697 / 2879 / 494
Регистрация: 15.11.2014
Сообщений: 6,478
Завершенные тесты: 1
13.07.2015, 20:46 #12
Цитата Сообщение от Evg Посмотреть сообщение
#pragma НЕ является директивой препроцессора.
и чем же она является?
потому что во всех источниках пишут - директива.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
13.07.2015, 21:05 #13
Потому как начинается с #

Добавлено через 7 минут
Для начинающего С++ полезно понимать:
1. Как работает #include (и весь процесс сборки), что такое Include guard
2. Конструкции #ifdef WIN32 / #endif
3. Что есть макросы _DEBUG, NDEBUG и как их использовать для отладки.

Все остальное по мере... заглядывая к примеру в Препроцессор Си
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2015, 21:28 #14
Цитата Сообщение от Evg Посмотреть сообщение
#pragma НЕ является директивой препроцессора.
Ну тут не так все однозначно.
В общем случае можно сказать, что не является.
Но есть #pragma, которые таки являются. Например, в GCC они описаны отдельно.
Оттуда:
This manual documents the pragmas which are meaningful to the preprocessor itself. Other pragmas are meaningful to the C or C++ compilers.
А в стандарте C99, она безоговорочно обозвана директивой препроцессора наравне с остальными.
Из предметного указателя:
#define preprocessing directive, 6.10.3
#elif preprocessing directive, 6.10.1
#else preprocessing directive, 6.10.1
#endif preprocessing directive, 6.10.1
#error preprocessing directive, 4, 6.10.5
#if preprocessing directive, 5.2.4.2.1, 5.2.4.2.2, 6.10.1, 7.1.4
#ifdef preprocessing directive, 6.10.1
#ifndef preprocessing directive, 6.10.1
#include preprocessing directive, 5.1.1.2, 6.10.2
#line preprocessing directive, 6.10.4
#pragma preprocessing directive, 6.10.6
#undef preprocessing directive, 6.10.3.5, 7.1.3, 7.1.4
Чтобы не было соблазна упрекнуть меня в неверном понимании словосочетания "preprocessing directive", сразу приведу цитату:
A preprocessing directive consists of a sequence of preprocessing tokens that begins with
a # preprocessing token that (at the start of translation phase 4) ...
Phase 4
Preprocessing directives are executed, macro invocations are expanded, and
_Pragma unary operator expressions are executed. If a character sequence that
matches the syntax of a universal character name is produced by token
concatenation (6.10.3.3), the behavior is undefined. A #include preprocessing
directive causes the named header or source file to be processed from phase 1
through phase 4, recursively. All preprocessing directives are then deleted.
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,641
Записей в блоге: 28
13.07.2015, 22:19 #15
Цитата Сообщение от hoggy Посмотреть сообщение
и чем же она является?
Директивой транслятора, потому что её обрабатывает именно транслятор, а не текстовый препроцессор. Хотя у виндузовых компиляторов через директиву #pragma настраиваются библиотеки, так что там вообще непонятно, директивой чего являются некоторые pragm'ы

Цитата Сообщение от DrOffset Посмотреть сообщение
А в стандарте C99, она безоговорочно обозвана директивой препроцессора наравне с остальными
С формальной точки зрения наверное так оно и есть, потому что всё то, что начинается с решётки, обрабатывается препроцессором. Но вся обработка сводится к тому, чтобы директиву без изменения дотащить до транслятора. Какая-нибудь фигня типа "#pragma GCC system_header" понимается только ВНЕ главного файла (т.е. в одном из файлов, подключенных через #include), а потому, вероятно, препроцессор частично за этим следит. Но конечная обработка всё равно остаётся в трансляторе, потому что языковые предупреждения выдаёт именно транслятор (эта прагма нужна именно для работы с предупреждениями)

C
/* Файл t.c */
#define A 1
#pragma STDC FENV_ACCESS ON
#include "t.h"
_Pragma ("abc") qqq
void func (void) { }
C
/* Файл t.h */
#pragma system_header
#line 100 "trampampam.h"
Код
$ gcc t.c -std=c99 -E
# 1 "t.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "t.c"

#pragma STDC FENV_ACCESS ON
# 1 "t.h" 1
#pragma system_header
# 100 "trampampam.h"
# 4 "t.c" 2

# 4 "t.c"
#pragma abc
# 4 "t.c"
 qqq
void func (void) { }
Обрати внимание, что #define, #include, #line и _Pragma, как директивы препроцессора, в саму препроцессорную выдачу не попали (потому что они обрабатываются препроцессором, а не транслятором), а обе прагмы попали (потому что они обрабатываются транслятором, а не препроцессором) плюс #pragma, родившаяся из раскрытия _Pragma

Добавлено через 35 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
потому что во всех источниках пишут - директива
Указание начальства - это тоже директива. И к препроцессору она так же не имеет отношения
1
13.07.2015, 22:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 22:19
Привет! Вот еще темы с ответами:

HLSL: Часто ли его приходится использовать? - DirectX
Сейчас читаю книгу Франка Д. Луны «Введение в программирование трехмерных игр с DirectX 9.0», и последние главы посвящены именно...

Нужны идеи для написания программ - C (Си)
Решил учить си путём написания программ от простых к сложным. Так вот, идей чего-бы сделать нету, а практики хочется. Последней написал вот...

Где взять ТЗ для написания программ - C#
Привет всем. Вот начал изучение и столкнулся с проблемой практикования своих знаний. Что сейчас актуально писать ? Просто вот...

Требуется литература для написания сложных программ - Turbo Pascal
Доброй ночи! Задали написать программу, а я с такими вещами вообще никогда не встречалась. Подскажите, пожалуйста, как писать на такую тему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru