Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 414
1

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

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

Author24 — интернет-сервис помощи студентам
Почему код работает, не должен же, потому что выражение стоящее после #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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2014, 14:25
Ответы с готовыми решениями:

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

Почему нельзя использовать глобальные переменные
Здравствуйте, собственно вышел сиз данным вопросом в гугл и на стаке нашел такой ответ:...

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

Почему локальные переменные методов нельзя изменять в анонимных классах?
Почему Java защищает от изменения локальные переменные методов, когда пытаешься их изменить в...

27
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2014, 18:43 21
Author24 — интернет-сервис помощи студентам
Тем не менее препроцессор может прочитать и то, и другое. И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил. Хотя по идее должен был ругаться отборной нецензурщиной.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
26.03.2014, 18:59 22
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
смотрю как работает, читаю книгу
Было бы кстати неплохо для расширения кругозора узнать, что это за книга и какой у вас компилятор.
0
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
26.03.2014, 19:13 23
Цитата Сообщение от taras atavin Посмотреть сообщение
И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил
Ничего он не подставил. Он ищет макроопределение обозначенное как а для сравнения с 99, естественно такого нет. Результат будет всегда одинаковый, независимо от того что задано в переменной а.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2014, 19:20 24
Тогда бы он ругался по-непечатному.
0
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
26.03.2014, 19:24 25
Цитата Сообщение от taras atavin Посмотреть сообщение
Тогда бы он ругался по-непечатному.
Не обязан. У препроцессора более простое отношение ко всем: протестируй разные варианты в своем окружении и убедишься. У него философия простая:
нет макропределения а, значит в условии сравнить невозможно, ну что же - выполняем тогда ветку else.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2014, 19:51 26
Это когда
C++
1
#ifdef a
, то есть проверяется существование, а не значение. А ошибки должны приводить к тому, что кода просто не будет.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
26.03.2014, 20:06 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, естественно такого нет. Результат будет всегда одинаковый, независимо от того что задано в переменной а.
2
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
26.03.2014, 20:10 28
taras atavin, ты о чем вообще?
Поменяй в том примере а-малую, на B, например, и результат не изменится. А после проверки добавь #define B 100, увидишь что начнет срабатывать первое условие. Как еще тебе объяснять - не знаю.

Не по теме:

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

0
26.03.2014, 20:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2014, 20:10
Помогаю со студенческими работами здесь

Можно ли в запросе фильтра подставлять переменные
В два грида выводятся отфильтрованые данные нельзя-ли в место запроса &quot;dv1.RowFilter =...

Почему нельзя командой copy скопировать системные файлы на дискету? Почему?
Пожалуйсат, подскажите, весь интернет перерыла, вот почему нельзя? что нельзя знаю, а по какой...

Почему в локальном классе доступны финальные переменные или переменные инициализированные при объявлении
Добрый вечер. Объясните пожалуйста, почему в локальном классе могут использоваться только финальные...

На рабочем столе нельзя перетаскивать ярлыки, нельзя копировать файлы и нельзя их вставлять
После загрузки компьютера вылезла ошибка, что кокойто файл windows неможет прочесть было предложено...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru