2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 414
|
||||||
1 | ||||||
Почему нельзя подставлять переменные в выражения #if #else?26.03.2014, 14:25. Показов 2648. Ответов 27
Метки нет (Все метки)
Почему код работает, не должен же, потому что выражение стоящее после #if вычисляется на этапе компиляции, переменные подставлять нельзя??
0
|
26.03.2014, 14:25 | |
Ответы с готовыми решениями:
27
Почему в switch нельзя определять переменные? Почему нельзя использовать глобальные переменные Почему нельзя использовать в операторе case переменные, которые определены как #define Почему локальные переменные методов нельзя изменять в анонимных классах? |
27 / 27 / 10
Регистрация: 10.04.2013
Сообщений: 91
|
|
26.03.2014, 14:28 | 2 |
а, собственно, зачем # перед if и else?
0
|
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 414
|
|
26.03.2014, 14:31 [ТС] | 3 |
просто кто то пишет какую то программу, по ходу задает вопросы, а кто то читает книги и примеры "абстрактные" конечно если я буду писать какую нить программу, я не буду где попало ставить #
0
|
101 / 101 / 39
Регистрация: 17.04.2011
Сообщений: 554
|
|
26.03.2014, 14:40 | 4 |
Директивы #if, #elif, #else и #endif (C/C++)http://msdn.microsoft.com/ru-r... hz0yd.aspx
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.03.2014, 14:41 | 5 |
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
26.03.2014, 14:42 | 6 |
Zla9_Kolu4ka, зачитайтесь вот из этого источника: Препроцессорные директивы в C/C++ (#include, #define и прочее) .
А именно:
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.03.2014, 14:46 | 7 |
Нет. Второе важное обстоятельство заключается в том, что этот иф обрабатывается статически на этапе компиляции, а условие в нём определяет не поведение программы, а сам её код, то есть от него зависит, что будет в исполняемой версии программы, а чего там вообще не будет.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
26.03.2014, 14:50 | 8 |
Нет. Третье, что необходимо отметить, что компиляция вообще не будет возможна при ошибках на этапе препроцессорной обработки, а без нее не имеет смысла говорить о поведении программы, так как код ее не будет сформирован правильно.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||
26.03.2014, 14:54 | 9 | |||||||||||||||
Нет. Этот фактор не отличает от грубых синтаксических ошибок в обычных операторах, если написать, например,
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
26.03.2014, 15:06 | 10 | |||||
предположу что a сделалась константой
а она известна на этапе компиляции Добавлено через 2 минуты попробуй вот так
Добавлено через 1 минуту так об чем ТС и спрашивает
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.03.2014, 15:06 | 11 |
Константой она не стала, но на этапе компиляции стала известна за счёт инициализации не кодом самой программы, а загрузчиком, входящим в состав операционной системы, то есть не операция присваивания, а само стартовое значение стало частью исполняемого файла. Вот только где гарантия, что подобные тонкости учитывают все компиляторы?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
26.03.2014, 15:10 | 12 |
разумеется нет, поскольку нет const
но для препроцессора наверное да, значение то известно, да и не используется больше нигде (ключевое слово наверное, т.е я ни в чем не уверен) об чем и речь
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||
26.03.2014, 15:11 | 13 | |||||||||||||||
Кроме того, сама возможность изменить переменную означает, что делать так всё равно нельзя:
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
26.03.2014, 15:14 | 14 |
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
26.03.2014, 15:16 | 15 | |||||
для чистоты эксперимента надо бы так написать
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.03.2014, 15:18 | 16 |
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|||||||||||
26.03.2014, 15:25 | 17 | ||||||||||
я лично не уверен
препроцессор работает до компилятора, инициализации то еще не было тем более что SatanaXIII, не работает, в каждой палатке свои порядки вот если бы было
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
26.03.2014, 15:28 | 18 |
Препроцессор тоже умеет читать исходник, так что она вполне была. Вот только юзать эту фичу нельзя, она предназначена не для программирования, а для выявления глюкописцев.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
26.03.2014, 18:38 | 20 | |||||
О чем вообще разговор-то? Препроцессинг это отдельный этап. Он никак не связан с компиляцией. В том плане что препроцессору вообще побоку что там написано с точки зрения языка. Он обрабатывает текст. Любой. Вообще. А директивы - это средство контроля этой обработки. Заменить там, А на Б. Вставить кусок С или кусок Б в зависимости от определенного условия (которое тем же препроцессором и задается).
Поэтому ни о каком родстве вот этих примеров не может быть и речи
0
|
26.03.2014, 18:38 | |
26.03.2014, 18:38 | |
Помогаю со студенческими работами здесь
20
Можно ли в запросе фильтра подставлять переменные Почему нельзя командой copy скопировать системные файлы на дискету? Почему? Почему в локальном классе доступны финальные переменные или переменные инициализированные при объявлении На рабочем столе нельзя перетаскивать ярлыки, нельзя копировать файлы и нельзя их вставлять Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |