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

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

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

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

26.03.2014, 14:25. Просмотров 883. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 14:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему нельзя подставлять переменные в выражения #if #else? (C++):

Почему в 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...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 15:18 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
что препроцессор из a считывает? может там вообще 0
Там 9.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
26.03.2014, 15:25 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
Там 9.
я лично не уверен
препроцессор работает до компилятора, инициализации то еще не было
тем более что SatanaXIII, не работает, в каждой палатке свои порядки
вот если бы было
C++
1
const int a = 9;
то вопрос другой, по сути это
C++
1
#define a 9
в тонкости реализации не лезу
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 15:28 #18
Цитата Сообщение от ValeryS Посмотреть сообщение
препроцессор работает до компилятора, инициализации то еще не было
Препроцессор тоже умеет читать исходник, так что она вполне была. Вот только юзать эту фичу нельзя, она предназначена не для программирования, а для выявления глюкописцев.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
26.03.2014, 15:40 #19
Цитата Сообщение от taras atavin Посмотреть сообщение
Вот только юзать эту фичу нельзя, она предназначена не для программирования, а для выявления глюкописцев.
вот здесь полностью согласен
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
26.03.2014, 18:38 #20
О чем вообще разговор-то? Препроцессинг это отдельный этап. Он никак не связан с компиляцией. В том плане что препроцессору вообще побоку что там написано с точки зрения языка. Он обрабатывает текст. Любой. Вообще. А директивы - это средство контроля этой обработки. Заменить там, А на Б. Вставить кусок С или кусок Б в зависимости от определенного условия (которое тем же препроцессором и задается).
Поэтому ни о каком родстве вот этих примеров не может быть и речи
C++
1
2
3
const int a = 9;
 
#define a 9
Первый случай, это языковая константа, которая подчиняется всем правилам языка, таким как: область видимости, время жизни, также учитывается ее тип и место определения. А второе это просто правило для автозамены вида "встретил а - подставь 9".
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 18:43 #21
Тем не менее препроцессор может прочитать и то, и другое. И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил. Хотя по идее должен был ругаться отборной нецензурщиной.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
26.03.2014, 18:59 #22
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
смотрю как работает, читаю книгу
Было бы кстати неплохо для расширения кругозора узнать, что это за книга и какой у вас компилятор.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
26.03.2014, 19:13 #23
Цитата Сообщение от taras atavin Посмотреть сообщение
И так как на ТС он не ругался, декларацию, причём, даже не константы, а переменной, он понял и девятку подставил
Ничего он не подставил. Он ищет макроопределение обозначенное как а для сравнения с 99, естественно такого нет. Результат будет всегда одинаковый, независимо от того что задано в переменной а.
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 19:20 #24
Тогда бы он ругался по-непечатному.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
26.03.2014, 19:24 #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Тогда бы он ругался по-непечатному.
Не обязан. У препроцессора более простое отношение ко всем: протестируй разные варианты в своем окружении и убедишься. У него философия простая:
нет макропределения а, значит в условии сравнить невозможно, ну что же - выполняем тогда ветку else.
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.03.2014, 19:51 #26
Это когда
C++
1
#ifdef a
, то есть проверяется существование, а не значение. А ошибки должны приводить к тому, что кода просто не будет.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
26.03.2014, 20:10 #28
taras atavin, ты о чем вообще?
Поменяй в том примере а-малую, на B, например, и результат не изменится. А после проверки добавь #define B 100, увидишь что начнет срабатывать первое условие. Как еще тебе объяснять - не знаю.

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2014, 20:10
Привет! Вот еще темы с ответами:

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.03.2014, 20:10
Ответ Создать тему
Опции темы

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