|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||||||||||||||||
Необходимо разобораться с предопределёнными макросами (компилятор g++)10.02.2014, 17:23. Показов 2308. Ответов 16
Метки нет (Все метки)
Друзья! Этой темой начинается (надеюсь, ей и закончится) цикл вопросов про предопределённые макросы. Те, которые мы определяем сами (или другие разработчики) , с ними можно разобраться, статью все знают, где читать. Те, которые определены компилятором- по ним вообще мало инфы.
++++++++++++++++++++++++++++++++++++++++ +++++ Итак, предопределённый макрос __FUNCTION__; читаем у Гриффитса:
Наблюдаем:
++++++++++++++++++++++++++++++++++++++++ ++++ То есть если бы __FUNCTION__ ВООБЩЕ не был живым, было бы как-то понятнее. Можно было бы предположить, что мой компилятор его не предопределяет- а не обязан потому что по стандарту. (к сожалению, это так, пункт 16.8 стандарта.) Но он в одном случае предопределён (при использовании), а в другом нет (при выводе предопределённых макросов). Почему так? Спасибо, кто откликнется, g++ 4.6.2
1
|
|||||||||||||||||||||||
| 10.02.2014, 17:23 | |
|
Ответы с готовыми решениями:
16
Переменная с предопределенными значениями Помогите разобораться! Срочно!
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 12.02.2014, 10:43 [ТС] | |
|
Ну что, ребята, какие будут мысли по этому поводу?
0
|
|
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
| 12.02.2014, 11:26 | |
|
Очевидно, что невозможно всегда иметь одно и тоже значение для всего файла, поэтому и предоставить что-то вразумительное на вывод этой команды затруднительно.
Более того, конкретно __FUNCTION__ не может обрабатываться препроцессором, ибо он вообще не знает имя текущей функции, то есть макросом в общем-то и не является. Между тем, __FUNCTION__ — штука нестандартная, зато с С99 и С++11 есть __func__.
2
|
|
|
|
|
| 12.02.2014, 11:38 | |
|
Прикольно! А какие еще есть встроенные макроопределения?
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||
| 12.02.2014, 11:53 | |||
Сообщение было отмечено kravam как решение
РешениеОтвет прост, __FUNCTION__ - это не макрос. Ответ тут.
2
|
|||
|
|
|
| 12.02.2014, 12:03 | |
|
Почему то не работают...
Bash __STDC_VERSION__ __OBJC__ __ASSEMBLER__
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 12.02.2014, 12:32 | |
|
1
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||||||||
| 15.02.2014, 22:41 [ТС] | ||||||||||||
|
Добавлено через 6 минут Получается, он наполовину макрос, наполовину нет. Тут он макрос:
0
|
||||||||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||
| 15.02.2014, 22:45 | |||||||
![]() Конструкция документирована. Просто она не макрос - это предопределенный идентификатор. Что-то вроде:
0
|
|||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 16.02.2014, 00:25 [ТС] | ||
|
Не думайте обо мне так плохо. Просто я плохо знаю английский язык. Кроме того, я не нашёл там, что она- предопределённый идентификатор. Что она не макрос, я прочёл. Что она содержит имя вызываемой функции я знал. Осталось узнать- как это называется, дабы обратиться к соответсвующему разделу "Predefined identifikator" (в стандарте или где) и всё про них узнать, всю их суть. А чёткого названия как-раз таки и не дано.
Добавлено через 13 минут Я вот сейчас увидел, что __func__уделено-таки некоторое внимание в стандарте:
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||
| 16.02.2014, 14:43 | |||||
|
В мануале GCC действительно не написано, что это именно идентификатор. Но это логически следует из описания. Однако я могу дать ссылку на другие источники где это четко обозначено, например вот. Либо, можно обратиться к стандарту С, там есть __func__ который семантически соответствует __FUNCTION__. 6.4.2.2
Значит это то, что в случае обращения к такому идентификатору внутри функции, компилятор автоматически генерирует константу такого вида
Вроде теперь все на своих местах, нет?
0
|
|||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||
| 17.02.2014, 01:39 [ТС] | |||
|
0
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||
| 17.02.2014, 18:49 | |||
|
Лучше открыть новый стандарт и заняться в нем поиском не всего подряд, а значимых вещей. Например вот: 8.4.1/8
0
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 17.02.2014, 18:59 | ||
Но в целом это ничего не меняет. Смысл фразы все равно один. И я его уже озвучил.
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 18.02.2014, 20:32 [ТС] | |
|
Ну, что же, картина прояснилась более или менее. Оказывается, по стандарту C++, существуют две сущности очень друг на друга похожие- предопределённые макросы и штука, называемая implementation-defined. И те и другие можно прочесть в стандарте. Использовать можно по разному, либо для вывода полезной информации, а в случае __cplusplus- так тот вообще определяет, как компилятором трактуется исходник- как Cи или как C++.
Ну, пожалуй, дальше в своих выводах я не пойду. Всё остальное надо читать в мануалах к собственному компилятору, а они в комплекте не шли. Теперь если буду менять компилятор, надо искать с мануалами- если такие в природе есть. Я-то думал, что Гриффитса и стандарта за глаза хватит, а оно вон как вышло. А к линуксному пояснению по GCC, обращаться я пока не буду- там ведь тоже некий стандарт, а как мой mingw себя ведёт на самом деле- поди знай.
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 18.02.2014, 20:53 | ||
|
Правильный термин тут predefined variable или predefined identifier. И они совсем не похожи с predefined macro, хоть и внешне можно так подумать. Потому что переменная, константа, идентификатор в программе - это единица языка. А макропоределения, даже предопределенные (predefined) - к языку С++ не осносятся. Это метаязык поверх, он обрабатывает текст, а не только исходный код на с++. То есть для макроса пофиг С++ у тебя, или С или еще что. Он работает с текстом.
0
|
||
| 18.02.2014, 20:53 | |
|
Помогаю со студенческими работами здесь
17
Ошибка: Необходимо в настройках комплекта задать компилятор для сборки
Компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7. Посоветуйте другой компилятор Задание с макросами Работа с макросами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|