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

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

Восстановить пароль Регистрация
 
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 00:40     препроцессор, #if #1
Создаю файл:
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++
Препроцессор С++Builder C++
Препроцессор С++Builder C++
C++ препроцессор с++
Препроцессор неправильно интерпретирует команды #if #else C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 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
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 10:47  [ТС]     препроцессор, #if #3
Цитата Сообщение от xAtom Посмотреть сообщение
В MS VC++ 6 вообще такой дериктивы нет.
в данный момент мне эта директива #warning не нужна,
мне нужно разобраться с директивой #if, пытаюсь настроить условную компиляцию, а эта директива, видимо, работает не так, как я себе это представляю.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
384 / 148 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2011, 11:06     препроцессор, #if #6
yekka, А что есть ABC? Что есть XXX? М?
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
26.10.2011, 11:08  [ТС]     препроцессор, #if #7
ForEveR, кажется, начинаю понимать.
а можно ли как-нибудь сравнить значение со строкой?
то есть, я хочу на этапе компиляции передавать некий параметр, например
g++ main.cpp -DPARAM=ABC
или
g++ main.cpp -DPARAM=XXX
и исходя из этого, чтобы препроцессор генерировал подходящий случаю код
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
384 / 148 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++
C (СИ) Препроцессор
C++ Почему не рекомендуется использовать препроцессор?

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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