быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Необходимо разобораться с предопределёнными макросами (компилятор g++)10.02.2014, 17:23. Показов 1931. Ответов 16
Метки нет (Все метки)
Друзья! Этой темой начинается (надеюсь, ей и закончится) цикл вопросов про предопределённые макросы. Те, которые мы определяем сами (или другие разработчики) , с ними можно разобраться, статью все знают, где читать. Те, которые определены компилятором- по ним вообще мало инфы.
+++++++++++++++++++++++++++++++++++++++++++++ Итак, предопределённый макрос __FUNCTION__; читаем у Гриффитса:
Наблюдаем:
++++++++++++++++++++++++++++++++++++++++++++ То есть если бы __FUNCTION__ ВООБЩЕ не был живым, было бы как-то понятнее. Можно было бы предположить, что мой компилятор его не предопределяет- а не обязан потому что по стандарту. (к сожалению, это так, пункт 16.8 стандарта.) Но он в одном случае предопределён (при использовании), а в другом нет (при выводе предопределённых макросов). Почему так? Спасибо, кто откликнется, g++ 4.6.2
1
|
10.02.2014, 17:23 | |
Ответы с готовыми решениями:
16
Переменная с предопределенными значениями Помогите разобораться! Срочно! Конструкторы ofstream и стандарт C++11 и компилятор gcc необходимо разобраться Ошибка: Необходимо в настройках комплекта задать компилятор для сборки |
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
12.02.2014, 10:43 [ТС] | 2 |
Ну что, ребята, какие будут мысли по этому поводу?
0
|
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
12.02.2014, 11:26 | 3 |
Очевидно, что невозможно всегда иметь одно и тоже значение для всего файла, поэтому и предоставить что-то вразумительное на вывод этой команды затруднительно.
Более того, конкретно __FUNCTION__ не может обрабатываться препроцессором, ибо он вообще не знает имя текущей функции, то есть макросом в общем-то и не является. Между тем, __FUNCTION__ — штука нестандартная, зато с С99 и С++11 есть __func__.
2
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
12.02.2014, 11:53 | 5 |
Сообщение было отмечено kravam как решение
Решение
Как говорил профессор Преображенский: "не читайте до обеда советских газет". Это я к тому, что ответы на вопросы по поводу GCC лучше искать не в книжках, а непосредственно в мануале по GCC.
Ответ прост, __FUNCTION__ - это не макрос. Ответ тут.
2
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
12.02.2014, 12:32 | 7 |
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
15.02.2014, 22:41 [ТС] | 8 | ||||||||||
А что это? Какая-то незадокументированная конструкция, получается.
Добавлено через 6 минут Получается, он наполовину макрос, наполовину нет. Тут он макрос:
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
||||||
15.02.2014, 22:45 | 9 | |||||
Я же дал ссылку на документацию GCC где об этом прямым текстом написано. Даже цитату сюда выписал и жирным подсветил
Конструкция документирована. Просто она не макрос - это предопределенный идентификатор. Что-то вроде:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
16.02.2014, 00:25 [ТС] | 10 |
Не думайте обо мне так плохо. Просто я плохо знаю английский язык. Кроме того, я не нашёл там, что она- предопределённый идентификатор. Что она не макрос, я прочёл. Что она содержит имя вызываемой функции я знал. Осталось узнать- как это называется, дабы обратиться к соответсвующему разделу "Predefined identifikator" (в стандарте или где) и всё про них узнать, всю их суть. А чёткого названия как-раз таки и не дано.
Добавлено через 13 минут Я вот сейчас увидел, что __func__уделено-таки некоторое внимание в стандарте:
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
16.02.2014, 14:43 | 11 |
В стандарте С++ этого не найти. Потому что это фича компилятора. Следовательно, первый источник мануал по компилятору.
В мануале GCC действительно не написано, что это именно идентификатор. Но это логически следует из описания. Однако я могу дать ссылку на другие источники где это четко обозначено, например вот. Либо, можно обратиться к стандарту С, там есть __func__ который семантически соответствует __FUNCTION__. 6.4.2.2 Это в старом стандарте. В последних двух (С99 и С11) это называется "predefined identifier". Значит это то, что в случае обращения к такому идентификатору внутри функции, компилятор автоматически генерирует константу такого вида Вроде теперь все на своих местах, нет?
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
17.02.2014, 01:39 [ТС] | 12 |
Я буду разбираться, а теперь,то, что на поверхности. Уточнение о терминах:
Если мы говорим о стандарте C++, то с точностью до наоборот. Вот последний стандарт. Я заколебался пыль глотать искать в нём "predefined identifier", а "implementation-defined" как раз таки- есть сплошь и рядом.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
17.02.2014, 18:49 | 13 |
Какой смысл искать просто слова "predefined identifier", а "implementation-defined"? - это же не словарь какой-то. Эти слова могут употребляться в разных смыслах, не обязательно в том, который мы подразумеваем в данный момент.
Лучше открыть новый стандарт и заняться в нем поиском не всего подряд, а значимых вещей. Например вот: 8.4.1/8
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
17.02.2014, 18:59 | 15 |
Прошу прощения. Я думал, что мы разговариваем в контексте стандартов С. Так как до недавнего времени в С++ стандарте не было никаких инструментов наподобие __func__ (были только расширения компиляторов, которые описывались в мануалах к компилятору, но не в стандарте). Поэтому подумал, что вы ссылаетесь на С стандарт Но в целом это ничего не меняет. Смысл фразы все равно один. И я его уже озвучил.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
18.02.2014, 20:32 [ТС] | 16 |
Ну, что же, картина прояснилась более или менее. Оказывается, по стандарту C++, существуют две сущности очень друг на друга похожие- предопределённые макросы и штука, называемая implementation-defined. И те и другие можно прочесть в стандарте. Использовать можно по разному, либо для вывода полезной информации, а в случае __cplusplus- так тот вообще определяет, как компилятором трактуется исходник- как Cи или как C++.
Ну, пожалуй, дальше в своих выводах я не пойду. Всё остальное надо читать в мануалах к собственному компилятору, а они в комплекте не шли. Теперь если буду менять компилятор, надо искать с мануалами- если такие в природе есть. Я-то думал, что Гриффитса и стандарта за глаза хватит, а оно вон как вышло. А к линуксному пояснению по GCC, обращаться я пока не буду- там ведь тоже некий стандарт, а как мой mingw себя ведёт на самом деле- поди знай.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
18.02.2014, 20:53 | 17 |
Увы нет. implementation-defined - это прилагательное. оно может быть применено например к параграфу про неопределенный порядок аргументов функции. Где implementation-defined, будет означать, что фактический порядок будет зависеть от реализации (implementation) - чего? системы, компилятора, платформы - не важно.
Правильный термин тут predefined variable или predefined identifier. И они совсем не похожи с predefined macro, хоть и внешне можно так подумать. Потому что переменная, константа, идентификатор в программе - это единица языка. А макропоределения, даже предопределенные (predefined) - к языку С++ не осносятся. Это метаязык поверх, он обрабатывает текст, а не только исходный код на с++. То есть для макроса пофиг С++ у тебя, или С или еще что. Он работает с текстом.
0
|
18.02.2014, 20:53 | |
18.02.2014, 20:53 | |
Помогаю со студенческими работами здесь
17
Правда ли, что для написания программ "для продажи" необходимо иметь лицензионный компилятор? Компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7. Посоветуйте другой компилятор Задание с макросами Работа с макросами Ошибка с макросами Работа с макросами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |