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

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

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

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

13.07.2015, 17:58. Просмотров 775. Ответов 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
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2015, 22:36 #16
Evg, Это все понятно.
Мой пост был о том, что категорично утверждать нельзя для всех случаев. Как захочет разработчик тулчейна, так и реализует.
Ну вот, а #pragma once, например, обработал препроцессор.

Добавлено через 8 минут
Я бы сказал, что эта самая прагма может быть директивой чего угодно, от препроцессора до линкера (как #pragma comment в MS).
1
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
13.07.2015, 23:09 #17
Цитата Сообщение от DrOffset Посмотреть сообщение
категорично утверждать нельзя для всех случаев
Согласен. Но подавляющее количество прагм обрабатывает транслятор. А препроцессор - считанные штуки

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
плюс #pragma, родившаяся из раскрытия _Pragma
Забыл написать, препроцессор сконвертировал директиву #line в директиву # транслятора (не знаю, как она правильно называется)
1
hoggy
6694 / 2876 / 494
Регистрация: 15.11.2014
Сообщений: 6,473
Завершенные тесты: 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
как вы можете прокомментировать ситуацию,
что прагму можно задействовать изнутри макросов?
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
14.07.2015, 13:27 #19
Цитата Сообщение от hoggy Посмотреть сообщение
если это не директива, тогда что это?
Я не утверждал "не директива". Я говорил "не директива препроцессора". Ты разницу между этими двумя понятиями не видишь?

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

Добавлено через 2 минуты
Ну и в догонку оговорка. Среди директив #pragma всё-таки есть в том числе и директивы препроцессора (типа #pragma once). Но основная масса прагм обрабатывается транслятором. Об этом я тоже писал выше
0
hoggy
6694 / 2876 / 494
Регистрация: 15.11.2014
Сообщений: 6,473
Завершенные тесты: 1
14.07.2015, 18:51 #20
Цитата Сообщение от Evg Посмотреть сообщение
Я не утверждал "не директива". Я говорил "не директива препроцессора". Ты разницу между этими двумя понятиями не видишь?
я именно "директиву препроцессора" и имел ввиду.

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

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

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

а то ведь так можно сказать: это не дерректива транслятора,
а дерректива отдельного компонента транслятора.
только в таком делении нет никакого практического смысла.
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
14.07.2015, 21:04 #21
Цитата Сообщение от hoggy Посмотреть сообщение
важно, что информация в исходном коде предназначается препроцессору
Ещё раз. Препроцессору предназначались считанные прагмы. Кроме "#pragma once" и "_Pragma" (которая даже и не #pragma) я пока не припоминаю директив #pragma, предназначенных препроцессору. Всё остальное он без изменения передаёт транслятору. Можно считать, что это есть процесс обработки, но тогда и про оператор switch или функцию printf можно сказать, что их обрабатывает препроцессор

Цитата Сообщение от hoggy Посмотреть сообщение
а то ведь так можно сказать: это не дерректива транслятора,
а дерректива отдельного компонента транслятора.
только в таком делении нет никакого практического смысла
Когда человек разбирающийся занимается программированием, он чётко понимает, что относится к препроцессору, что к транслятору, а что к линкеру. Без этого никуда. А вот дробить транслятор на запчасти не к чему. Так что сравнение не в тему
0
klopik
58 / 58 / 10
Регистрация: 18.05.2015
Сообщений: 306
14.07.2015, 21:06 #22
Не считая инклюда вообще практически никогда.
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,628
Записей в блоге: 28
14.07.2015, 21:08 #23
Цитата Сообщение от Evg Посмотреть сообщение
Кроме "#pragma once" и "_Pragma"
Ещё #line
0
14.07.2015, 21:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 21:08
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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