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

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

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

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

26.10.2011, 00:40. Просмотров 999. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 00:40     препроцессор, #if
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
26.10.2011, 09:11     препроцессор, #if #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
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 10:47  [ТС]     препроцессор, #if #3
Цитата Сообщение от xAtom Посмотреть сообщение
В MS VC++ 6 вообще такой дериктивы нет.
в данный момент мне эта директива #warning не нужна,
мне нужно разобраться с директивой #if, пытаюсь настроить условную компиляцию, а эта директива, видимо, работает не так, как я себе это представляю.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.10.2011, 10:59     препроцессор, #if #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
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 11:04  [ТС]     препроцессор, #if #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
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.10.2011, 11:06     препроцессор, #if #6
yekka, А что есть ABC? Что есть XXX? М?
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 11:08  [ТС]     препроцессор, #if #7
ForEveR, кажется, начинаю понимать.
а можно ли как-нибудь сравнить значение со строкой?
то есть, я хочу на этапе компиляции передавать некий параметр, например
g++ main.cpp -DPARAM=ABC
или
g++ main.cpp -DPARAM=XXX
и исходя из этого, чтобы препроцессор генерировал подходящий случаю код
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.10.2011, 11:12     препроцессор, #if #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, Со строками как-то проблемно. По-моему нет.
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 11:20  [ТС]     препроцессор, #if #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 // выдаст ошибку на этапе обработки препроцессором

Можно ли это сделать или препроцессор так не работает?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.10.2011, 11:26     препроцессор, #if #10
yekka, Так не работает. TXT это ничто. Как и остальные параметры.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2011, 11:52     препроцессор, #if
Еще ссылки по теме:

Почему не рекомендуется использовать препроцессор? - 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++
добрый день есть ли возможность использовать препроцессор подобным образом? (пример в коде, естестенно "как есть" не прокатывает) ...

Используя препроцессор заменить некоторое выражение на другое - C++
Как можно используя препроцессор заменить некоторое выражение на другое даже если само выражение содержит спец. символы? Короче говоря,...

Какой препроцессор используется для подключения стандартной библиотеки ввода-вывода? - C++
Какой препроцессор используется для подключения стандартной библиотеки ввода-вывода? 1) include 2) iostream 3) define 4) io.sys


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

Или воспользуйтесь поиском по форуму:
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
26.10.2011, 11:52     препроцессор, #if #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
Yandex
Объявления
26.10.2011, 11:52     препроцессор, #if
Ответ Создать тему
Опции темы

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