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

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

Войти
Регистрация
Восстановить пароль
 
 
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 398
#1

Почему нельзя подставлять переменные в выражения #if #else? - C++

26.03.2014, 14:25. Просмотров 823. Ответов 27
Метки нет (Все метки)

Почему код работает, не должен же, потому что выражение стоящее после #if вычисляется на этапе компиляции, переменные подставлять нельзя??

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <iostream>
using namespace std;
 
int a = 9;
 
int main(void){
#if a>99
    printf("Kompiliruet, esli a bol'she 9\n");          
#else
    printf("Kompiliruet, esli a men'she 9\n");
#endif
 
    char ch = getchar();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 14:25     Почему нельзя подставлять переменные в выражения #if #else?
Посмотрите здесь:

Почему в switch нельзя определять переменные? - C++
int main() { setlocale(LC_ALL, &quot;Russian&quot;); int n; std::cout &lt;&lt; &quot;Введите число: &quot;; std::cin &gt;&gt; n; switch...

Почему нельзя использовать в операторе case переменные, которые определены как #define - C++
Я не понимаю, почему Visual Studio ругается на строку с case в коде. Вроде все правильно. Если там написать напрямую цифру, тогда все...

Почему break нельзя использовать в if? - C++
почему break нельзя использовать в if вот код if(f.eof()==1) { break; } про break MVS говорит что ОПЕРАТОР break...

Почему нельзя написать просто - using namespace boost; - C++
Доброго времени суток. В общем, есть программа, в которой я использую тип cpp_int. Вроде его объявление содержится в заголовочном файле...

Почему нельзя выделить статически кусок в ~100 MB? - C++
Есть код #include &lt;iostream&gt; using namespace std; enum { length = 256, count = 50 }; struct Town { char name =...

Почему нельзя так объявить двумерный массив? - C++
Ошибка возникает если для массива tempArray при объявлении(и одновременной инициализации) использовать переменную(size) которую принимает...

Почему таким способом нельзя создать массив? - C++
Хочу создать массив вот таким способом, но выскакивает ошибка error C2057: требуется константное выражение. Ведь у меня и так константа!?...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 18:43     Почему нельзя подставлять переменные в выражения #if #else? #21
Тем не менее препроцессор может прочитать и то, и другое. И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил. Хотя по идее должен был ругаться отборной нецензурщиной.
SatanaXIII
Супер-модератор
Эксперт С++
5591 / 2625 / 239
Регистрация: 01.11.2011
Сообщений: 6,454
Завершенные тесты: 1
26.03.2014, 18:59     Почему нельзя подставлять переменные в выражения #if #else? #22
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
смотрю как работает, читаю книгу
Было бы кстати неплохо для расширения кругозора узнать, что это за книга и какой у вас компилятор.
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,893
26.03.2014, 19:13     Почему нельзя подставлять переменные в выражения #if #else? #23
Цитата Сообщение от taras atavin Посмотреть сообщение
И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил
Ничего он не подставил. Он ищет макроопределение обозначенное как а для сравнения с 99, естественно такого нет. Результат будет всегда одинаковый, независимо от того что задано в переменной а.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 19:20     Почему нельзя подставлять переменные в выражения #if #else? #24
Тогда бы он ругался по-непечатному.
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,893
26.03.2014, 19:24     Почему нельзя подставлять переменные в выражения #if #else? #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Тогда бы он ругался по-непечатному.
Не обязан. У препроцессора более простое отношение ко всем: протестируй разные варианты в своем окружении и убедишься. У него философия простая:
нет макропределения а, значит в условии сравнить невозможно, ну что же - выполняем тогда ветку else.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 19:51     Почему нельзя подставлять переменные в выражения #if #else? #26
Это когда
C++
1
#ifdef a
, то есть проверяется существование, а не значение. А ошибки должны приводить к тому, что кода просто не будет.
ValeryS
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,624
26.03.2014, 20:06     Почему нельзя подставлять переменные в выражения #if #else? #27
короче протестировал я на двух компиляторах
вот такую конструкцию
const int a=10;
C
1
2
3
4
5
6
#if a>5
...................
#else
 
.....................
#endif
в обоих отрабатывается ветка #else
но если VS молчит как партизан
то CodeVision
честно сказал
Warning: C:\prjAvr\Samkov\Mega8_ver1_0\convertDmx.c(11): undefined symbol 'a', assumed zero
правда не ошибка а предупреждение
так что DrOffset, прав
Цитата Сообщение от DrOffset Посмотреть сообщение
Он ищет макроопределение обозначенное как а для сравнения с 99, естественно такого нет. Результат будет всегда одинаковый, независимо от того что задано в переменной а.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2014, 20:10     Почему нельзя подставлять переменные в выражения #if #else?
Еще ссылки по теме:

Почему два char нельзя сравнивать так ==? - C++
Почему два char нельзя сравнивать так ==?

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

Почему нельзя объявить динамический массив глобально - C++
вот код #include &lt;iostream&gt; #include &lt;string&gt; int w = 0; string *s = new string ; using namespace std; int main { ...

Почему нельзя объявить указатель на шаблонную структуру? - C++
template &lt;class T&gt; typedef struct per { T znach; int kol_vo_povt; }* p; int main() { per&lt;int&gt; k; }

Почему нельзя обратиться к адресу с помощью & в массивах? - C++
Почему нельзя обратиться к адресу с помощью &amp; в массивах; Например: #include &lt;iostream&gt; using namespace std; int main(){ ...


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

Или воспользуйтесь поиском по форуму:
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,893
26.03.2014, 20:10     Почему нельзя подставлять переменные в выражения #if #else? #28
taras atavin, ты о чем вообще?
Поменяй в том примере а-малую, на B, например, и результат не изменится. А после проверки добавь #define B 100, увидишь что начнет срабатывать первое условие. Как еще тебе объяснять - не знаю.

Не по теме:

Это такие дикие основы, что даже странно, почему тут развели тему на 3 страницы.

Yandex
Объявления
26.03.2014, 20:10     Почему нельзя подставлять переменные в выражения #if #else?
Ответ Создать тему
Опции темы

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