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

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

Войти
Регистрация
Восстановить пароль
 
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
#1

препроцессор, #if - C++

26.10.2011, 00:40. Просмотров 1043. Ответов 10
Метки нет (Все метки)

Создаю файл:
C++
1
2
3
4
5
6
7
#define PARAM ABC
#if PARAM == ABC
#warning warning passed
#endif
#if PARAM == XXX
#error error reached
#endif
при компиляции получаю:
test.cpp:3:2: warning: #warning warning passed
test.cpp:6:2: error: #error error reached

Что я делаю не так?
Почему проверка проходится проверка #if PARAM == XXX когда я точно знаю, что PARAM == ABC
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 00:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос препроцессор, #if (C++):

Препроцессор - C++
Профессионалы, ответте вот на какой вопрос: Мне необходимо получить файл, который образуется после обработки препроцессором, т.е....

препроцессор с++ - C++
Задача: Сделать так, что бы при определённом условии класс "знал" что его тестируют в консоли, и выводил в неё всю необходимую...

Препроцессор #pragma - C++
Как я понимаю, препроцессор #pragma используется, в частности, для выравнивания полей в структурах. Например, в заголовочном файле перед...

Препроцессор vs текст - C++
Привет. Я баловался с директивами препроцессора и как-то задумал с помощью директивы #include вставить текст в char *. У меня вышло, я...

Препроцессор С++Builder - C++
Напишите программу, которая выводит на экран квадрат Пифагора — таблицу умножения.

Почему не работает препроцессор? - C++
Почему не работает программа? Вроде все сделал правильно. Задание: Создать проект в котором: 1. создать три файла: ( function.h ,...

10
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
26.10.2011, 09:11 #2
Цитата Сообщение от yekka Посмотреть сообщение
#warning warning passed
В MS VC++ 6 вообще такой дериктивы нет.
C++
1
2
3
4
5
6
#define PARAM ABC
#if PARAM == ABC
#pragma message("warning предупреждение")
#elif PARAM == XXX
#error error reached
#endif
0
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 10:47  [ТС] #3
Цитата Сообщение от xAtom Посмотреть сообщение
В MS VC++ 6 вообще такой дериктивы нет.
в данный момент мне эта директива #warning не нужна,
мне нужно разобраться с директивой #if, пытаюсь настроить условную компиляцию, а эта директива, видимо, работает не так, как я себе это представляю.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.10.2011, 10:59 #4
yekka, А вы понимаете что получается? После раскрытия.

Код
if ABC == ABC
if ABC == XXX
Вас кстати подсказали как нужно, используйте #elif.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
#define ABC 1
 
#define PARAM ABC
 
#if PARAM == ABC
#warning some_warn
#endif
#if PARAM == XXX
#warning other_warn
#endif
1
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 11:04  [ТС] #5
Цитата Сообщение от ForEveR Посмотреть сообщение
yekka, А вы понимаете что получается?
,
нет, я, видимо, не понимаю, что получается. вот еще файл:
C++
1
2
3
#if ABC == XXX
#pragma message("ABC == XXX")
#endif
При компиляции имею:
test.cpp:2: note: #pragma message: ABC == XXX

Что за чушь? Как препроцессор так проверяет условия, что у него ABC равно XXX
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.10.2011, 11:06 #6
yekka, А что есть ABC? Что есть XXX? М?
0
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 11:08  [ТС] #7
ForEveR, кажется, начинаю понимать.
а можно ли как-нибудь сравнить значение со строкой?
то есть, я хочу на этапе компиляции передавать некий параметр, например
g++ main.cpp -DPARAM=ABC
или
g++ main.cpp -DPARAM=XXX
и исходя из этого, чтобы препроцессор генерировал подходящий случаю код
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.10.2011, 11:12 #8
C++
1
2
3
4
5
6
7
8
#define ABC 1
#define XXX 2
 
#if ABC == XXX
#pragma message("ABC == XXX")
#else
#pragma message("ABC != XXX")
#endif
Добавлено через 3 минуты
yekka, Со строками как-то проблемно. По-моему нет.
0
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 11:20  [ТС] #9
Цитата Сообщение от ForEveR Посмотреть сообщение
А что есть ABC? Что есть XXX?
ну, например, файловые расширения.
то есть, я хотел, чтобы где-нибудь в коде у нас была такая структура:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef PARAM
#define PARAM TXT
#endif
 
#if PARAM == TXT
#include "txt.cpp"
#elif PARAM == DOC
#include "doc.cpp"
#elif PARAM == RTF
#include "rtf.cpp"
#else
#error wrong param
#endif
и чтобы мы могли компилировать этот код с разными параметрами, например:
g++ main.cpp -DPARAM=TXT
g++ main.cpp -DPARAM=RTF
g++ main.cpp -DPARAM=DOC
g++ main.cpp -DPARAM=PDF // выдаст ошибку на этапе обработки препроцессором

Можно ли это сделать или препроцессор так не работает?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.10.2011, 11:26 #10
yekka, Так не работает. TXT это ничто. Как и остальные параметры.
1
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
26.10.2011, 11:52 #11
В зависимости от того как определен PARAM, будет включен соответствующий файл
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define TXT  0
#define DOC  1
#define RTF  2
 
#define PARAM RTF
 
#if PARAM == TXT
    #define HDR "txt.h"
#elif PARAM == DOC
    #define HDR "doc.h"
#elif PARAM == RTF
    #define HDR "rtf.h"
#else
    #error wrong parameter
#endif
#include HDR
1
26.10.2011, 11:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2011, 11:52
Привет! Вот еще темы с ответами:

Препроцессор,исключительные ситуации - C++
Всем доброго времени суток!) По прочтению изложенного в моей книге материала по искл. ситуациям и операторам препроцессора(? так можно...

Почему не рекомендуется использовать препроцессор? - C++
Я сейчас активно пользуюсь #define для упрощения понимания кода. Например, у меня сложная система классов, что бы получить одну...

Препроцессор неправильно интерпретирует команды #if #else - C++
#define __LINUX_OS__ #if defined__LINUX_OS__ #include <unistd.h> #elif defined __WINDOWS_OS__ #include <windows.h> #else ...

Avr c/c++ препроцессор для макроса PORT_x - C++
добрый день есть ли возможность использовать препроцессор подобным образом? (пример в коде, естестенно "как есть" не прокатывает) ...


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

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

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