Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Ferrari F1
Заблокирован
414 / 288 / 63
Регистрация: 27.01.2015
Сообщений: 1,922
Записей в блоге: 1
Завершенные тесты: 1
13.07.2015, 17:58     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #1
Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2015, 17:58     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++?
Посмотрите здесь:

C++ Немогу разобраться с директивами
C++ Необходимо разобраться с директивами условной компиляции
C++ Как дать доступ к разделенной памяти для пользовательских программ из сервиса
Заданчи для написания программ в с++ C++
C++ Как создать чекер для проверки консольных программ
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
13.07.2015, 18:00     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #2
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
Если вы про макросы, то как можно реже: 16. Избегайте макросов
А вообще сильно зависит от области применения.
Ferrari F1
Заблокирован
414 / 288 / 63
Регистрация: 27.01.2015
Сообщений: 1,922
Записей в блоге: 1
Завершенные тесты: 1
13.07.2015, 18:05  [ТС]     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #3
Avazart, а если говорить про директивы прагма или лайн? нужно ли сосредотачивать на их изучении внимание? или ими, в основном, не пользуются?
MicM
 Аватар для MicM
820 / 487 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
13.07.2015, 18:10     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #4
Ну #include явно придется использовать.
При написании собственных заголовочных файлов, например:
C++
1
2
3
4
#ifndef ABC
#define ABC
// ...
#endif
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
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)
};
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
13.07.2015, 18:28     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #6
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Как часто приходится манипулировать директивами препроцессора и вобще использовать их для написания программ на Си++?
постоянно.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
13.07.2015, 18:30     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #7
Цитата Сообщение от hoggy Посмотреть сообщение
постоянно
главное чтобы "дебажить" потом не пришлось трехуровневый Define
SEGNET
26 / 26 / 4
Регистрация: 28.12.2012
Сообщений: 224
13.07.2015, 18:34     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #8
Проект написанный для разных платформ, явно использует большое количество инструкций препроцессора.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
13.07.2015, 18:41     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Avazart, а если говорить про директивы прагма или лайн? нужно ли сосредотачивать на их изучении внимание? или ими, в основном, не пользуются?
А что о них говорить. Ясное дело не плохо бы о них знать, но использовать - по минимуму.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
13.07.2015, 18:47     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #10
Цитата Сообщение от Raali Посмотреть сообщение
главное чтобы "дебажить" потом не пришлось трехуровневый Define
1.
диррективны препроцессора - это не только декларации макросов.
сюда входят #include и компания.

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

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

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

4.
разумеется, если задача решается и без макросов,
то нет ни одной причины их использовать.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16830 / 5251 / 322
Регистрация: 30.03.2009
Сообщений: 14,144
Записей в блоге: 26
13.07.2015, 20:35     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #11
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
а если говорить про директивы прагма или лайн?
#pragma НЕ является директивой препроцессора. А #line никакой полезной нагрузки не несёт, его и изучать-то не надо
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
13.07.2015, 20:46     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #12
Цитата Сообщение от Evg Посмотреть сообщение
#pragma НЕ является директивой препроцессора.
и чем же она является?
потому что во всех источниках пишут - директива.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
13.07.2015, 21:05     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #13
Потому как начинается с #

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

Все остальное по мере... заглядывая к примеру в Препроцессор Си
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
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.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16830 / 5251 / 322
Регистрация: 30.03.2009
Сообщений: 14,144
Записей в блоге: 26
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 Посмотреть сообщение
потому что во всех источниках пишут - директива
Указание начальства - это тоже директива. И к препроцессору она так же не имеет отношения
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
13.07.2015, 22:36     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #16
Evg, Это все понятно.
Мой пост был о том, что категорично утверждать нельзя для всех случаев. Как захочет разработчик тулчейна, так и реализует.
Ну вот, а #pragma once, например, обработал препроцессор.

Добавлено через 8 минут
Я бы сказал, что эта самая прагма может быть директивой чего угодно, от препроцессора до линкера (как #pragma comment в MS).
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16830 / 5251 / 322
Регистрация: 30.03.2009
Сообщений: 14,144
Записей в блоге: 26
13.07.2015, 23:09     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #17
Цитата Сообщение от DrOffset Посмотреть сообщение
категорично утверждать нельзя для всех случаев
Согласен. Но подавляющее количество прагм обрабатывает транслятор. А препроцессор - считанные штуки

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
плюс #pragma, родившаяся из раскрытия _Pragma
Забыл написать, препроцессор сконвертировал директиву #line в директиву # транслятора (не знаю, как она правильно называется)
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
14.07.2015, 12:12     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #18
Цитата Сообщение от Evg Посмотреть сообщение
Указание начальства - это тоже директива. И к препроцессору она так же не имеет отношения
это не ответ, поскольку ничего не объясняет.

а объяснение здесь заключается в том:
если это не директива, тогда что это? и чем это отличается от директивы.

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


Цитата Сообщение от Evg Посмотреть сообщение
Директивой транслятора, потому что её обрабатывает именно транслятор, а не текстовый препроцессор. Хотя у виндузовых компиляторов через директиву #pragma настраиваются библиотеки, так что там вообще непонятно, директивой чего являются некоторые pragm'ы
а вот это уже ответ.

однако меня смущает как минимум один момент:

если бы вы были бы правы,
тогда было бы невозможным использовать прагму в макросах.

но тем не менее это возможно.
вы же не будете утверждать,
что пропроцессор не занимается подстановками текста (раскрытием макросов) ?


рассмотрим рецепт изготовления
"кросс-платформенного точечного подавления предупреждений компилятора"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//pragma_warning.h
 
#pragma once
 
#if defined(__GNUC__) || defined(__MINGW__) || defined(__MINGW32__)
    #define WRN_UNUSED_VARIABLE         "-Wunused-variable"
    #define WRN_UNREFERENCED_VARIABLE   WRN_UNUSED_VARIABLE
#elif defined(_MSC_VER)
    #define WRN_UNUSED_VARIABLE         4100
    #define WRN_UNREFERENCED_VARIABLE   4101
#endif
 
 
#define STRINGIFY_(a) #a
#define STRINGIFY(a) STRINGIFY_(a)
 
#if defined(__GNUC__) || defined(__MINGW__) || defined(__MINGW32__)
 
    #define TODO(x) \
        _Pragma( STRINGIFY_(message "in file:" ))           \
        _Pragma( STRINGIFY_(message STRINGIFY(__FILE__) "(" STRINGIFY(__LINE__) ")" ))  \
        _Pragma( STRINGIFY_(message #x))
 
    #define PRAGMA_DISABLE_WARNING(warning_type) \
        _Pragma( STRINGIFY_(GCC diagnostic ignored warning_type) )
 
    #define PRAGMA_PUSH \
        _Pragma( "GCC diagnostic push" )
 
    #define PRAGMA_POP \
        _Pragma( "GCC diagnostic pop" )
 
#elif defined(_MSC_VER)
 
    #define TODO(x) \
        __pragma(message("in file:\n" __FILE__ "(" STRINGIFY(__LINE__) "):\nmessage: " x))
 
    #define PRAGMA_DISABLE_WARNING(warning_type) \
        __pragma(warning(disable: warning_type))
 
    #define PRAGMA_PUSH \
        __pragma(warning(push))
 
    #define PRAGMA_POP \
        __pragma(warning(pop))
 
#else
    error: compiler not support
#endif

использование:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
PRAGMA_PUSH
PRAGMA_DISABLE_WARNING(WRN_UNREFERENCED_VARIABLE)
TEST(TEST_CASE_NAME, TEST_NUMBER(002))
{
    // подавляем предупреждения компилятора
    // о не используемых переменных
 
    // должно единообразно работать на тулсетах cl/gcc/mingw/clang
    int a1 =10;
    int a2 =10;
    int a3 =10;
}
PRAGMA_POP
как вы можете прокомментировать ситуацию,
что прагму можно задействовать изнутри макросов?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16830 / 5251 / 322
Регистрация: 30.03.2009
Сообщений: 14,144
Записей в блоге: 26
14.07.2015, 13:27     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #19
Цитата Сообщение от hoggy Посмотреть сообщение
если это не директива, тогда что это?
Я не утверждал "не директива". Я говорил "не директива препроцессора". Ты разницу между этими двумя понятиями не видишь?

Цитата Сообщение от hoggy Посмотреть сообщение
тогда было бы невозможным использовать прагму в макросах
В макросах используется конструкция _Pragma, которую препроцессор превращает в директиву транслятора #pragma. Я же специально на примере в посте #15 всё показал и написал

Добавлено через 2 минуты
Ну и в догонку оговорка. Среди директив #pragma всё-таки есть в том числе и директивы препроцессора (типа #pragma once). Но основная масса прагм обрабатывается транслятором. Об этом я тоже писал выше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 18:51     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++?
Еще ссылки по теме:

Хак препроцессора, объясните как работает C++
программа с директивами процессора или с использованием функций printf и scanf C++
Каковы современные решения написания программ? C++

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

Или воспользуйтесь поиском по форуму:
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
14.07.2015, 18:51     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++? #20
Цитата Сообщение от Evg Посмотреть сообщение
Я не утверждал "не директива". Я говорил "не директива препроцессора". Ты разницу между этими двумя понятиями не видишь?
я именно "директиву препроцессора" и имел ввиду.

Цитата Сообщение от Evg Посмотреть сообщение
которую препроцессор превращает в директиву транслятора
то есть он её обрабатывает.

собственно, не так важно, как там технология реализуется под капотом.
важно, что информация в исходном коде предназначается препроцессору.

как именно он будет её обрабатывать,
и кому делегировать - это уже не принципиально.

а то ведь так можно сказать: это не дерректива транслятора,
а дерректива отдельного компонента транслятора.
только в таком делении нет никакого практического смысла.
Yandex
Объявления
14.07.2015, 18:51     Как часто приходится манипулировать директивами препроцессора для написания программ на Си++?
Ответ Создать тему
Опции темы

Текущее время: 21:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru