Re[7]: Реализация BOOST_CURRENT_FUNCTION
От: Vain Россия google.ru
Дата: 01.12.12 22:47
Оценка:
Здравствуйте, igna, Вы писали:

NT>>Т.е. даже просто для того, чтобы проверить, определён ли макрос __FUNCSIG__ при помощи препроцессорной директивы #ifdef, нам нужна функция?

I>В документации написано "Valid only within a function", так-что если не хочешь полагаться на недокументированное поведение компилятора, то да, нужна функция.
почему недокументированное? все встроенные макросы должны быть определены до стадии препроцессора.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: Реализация BOOST_CURRENT_FUNCTION
От: igna Россия  
Дата: 02.12.12 08:22
Оценка:
Здравствуйте, Vain, Вы писали:

V>почему недокументированное? все встроенные макросы должны быть определены до стадии препроцессора.


А это что означает: "Valid only within a function"?
Re[12]: Реализация BOOST_CURRENT_FUNCTION
От: igna Россия  
Дата: 02.12.12 08:32
Оценка:
Здравствуйте, Vain, Вы писали:

V>что ifdef вернёт false


На это никто не полагается, полагаются на то, что ifdef вернёт true внутри функции.

Компилятор может одно из трех:

— дать гарантию, что макрос определен внутри функции;
— дать гарантию, что макрос не определен внутри функции;
— не давать никакой из этих двух гарантий.

Кроме того он может одно из трех:

— дать гарантию, что макрос определен вне функции;
— дать гарантию, что макрос не определен вне функции;
— не давать никакой из этих двух гарантий.

Всего имеем 9 возможных комбинаций, VC++ согласно документации:

— дает гарантию, что __FUNCSIG__ определен внутри функции;
— не дает никакой гарантии по поводу определенности __FUNCSIG__ вне функции.

Поэтому надежно использовать его можно только внутри функции.
Re[13]: Реализация BOOST_CURRENT_FUNCTION
От: Vain Россия google.ru
Дата: 02.12.12 16:04
Оценка: 1 (1) -1 :)
Здравствуйте, igna, Вы писали:

V>>что ifdef вернёт false

I>На это никто не полагается, полагаются на то, что ifdef вернёт true внутри функции.
макрос должен быть определён или неопределён до стадии препроцессора, там не никаких функций ещё
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[9]: Реализация BOOST_CURRENT_FUNCTION
От: Vain Россия google.ru
Дата: 02.12.12 16:08
Оценка:
Здравствуйте, igna, Вы писали:

V>>почему недокументированное? все встроенные макросы должны быть определены до стадии препроцессора.

I>А это что означает: "Valid only within a function"?
видимо символ __FUNCSIG__ будет заменён на стадии компиляции а не процессора?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: Реализация BOOST_CURRENT_FUNCTION
От: igna Россия  
Дата: 03.12.12 07:52
Оценка:
Здравствуйте, Vain, Вы писали:

V>видимо символ __FUNCSIG__ будет заменён на стадии компиляции а не процессора?


То есть, вне функции __FUNCSIG__ определен, но недействителен?

Можно и так понять, что __FUNCSIG__ определен как что-то вроде:

#define __FUNCSIG__ __funcsig__


А __funcsig__ в свою очередь как (статическая) константная переменная внутри функции.

Но я б на это не полагался, документация оставляет вопрос открытым, определен ли __FUNCSIG__ вне функции. Нет же в стандарте ограничения, что любой нестандартный предопределенный макрос должен быть либо не определен, либо определен везде.
Re[14]: Реализация BOOST_CURRENT_FUNCTION
От: igna Россия  
Дата: 03.12.12 07:57
Оценка:
Здравствуйте, Vain, Вы писали:

V>макрос должен быть определён или неопределён до стадии препроцессора, там не никаких функций ещё


Где такое написано? По крайней мере есть __FILE__ и __LINE__, которые хоть и определены везде, но меняют значение. Это конечно не одно и тоже, переопределить макрос и "разопределить" его, но достаточно близкие вещи. Если компилятору вздумается поиметь предопределенный макрос, определенный не везде, стандарту это противоречит не будет.
Re[13]: Реализация BOOST_CURRENT_FUNCTION
От: flаt  
Дата: 03.12.12 09:24
Оценка:
Здравствуйте, igna, Вы писали:

I>Компилятор может одно из трех:

А какая связь между препроцессором (который поддерживает #ifdef и #define) и функцией? Ведь препроцессор не знает, где он сейчас — в глобальном пространстве, классе или функции.

ЗЫ: по стандарту __func__ & K° должы быть эквивалентны const char __current_function[], насколько я помню, то есть, мы можем сказать, что __func__ доступен где угодно (как обычный #define something), но не определён (к примеру, вне функции там будет "\0".

Так как же реализуется поддержка #ifdef (или #if ?) на уровне препроцессора?
Re[14]: Реализация BOOST_CURRENT_FUNCTION
От: igna Россия  
Дата: 03.12.12 09:53
Оценка:
Здравствуйте, flаt, Вы писали:

F>ЗЫ: по стандарту __func__ & K° должы быть эквивалентны const char __current_function[]


По какому стандарту?
Re[11]: Реализация BOOST_CURRENT_FUNCTION
От: rg45 СССР  
Дата: 03.12.12 10:02
Оценка:
Здравствуйте, igna, Вы писали:

I>>>А это что означает: "Valid only within a function"?


V>>видимо символ __FUNCSIG__ будет заменён на стадии компиляции а не процессора?


I>То есть, вне функции __FUNCSIG__ определен, но недействителен?

I>Можно и так понять, что __FUNCSIG__ определен как что-то вроде:

I>
I>#define __FUNCSIG__ __funcsig__
I>

I>А __funcsig__ в свою очередь как (статическая) константная переменная внутри функции.

Несложные эксперименты в Visual Studio показывают, что все так и есть. __FUNCSIG__ — хитрый такой макрос, который определен как __FSTREXP __FUNCSIG__ (__FSTREXP — пустое макроопределение). Его нельзя ни переопределить, ни отменить. И, как видно, "валиден" и "определен"- не одно и то же — студия позволяет использовать __FUNCSIG__ в других директивах (в т.ч. и для определения других макросов). Но при попытке развернуть его до строкового значения вне функции вызывает ошибку компиляции: "'__FUNCSIG__': predefined macro cannot appear outside of a function body".
--
Справедливость выше закона. А человечность выше справедливости.
Re[12]: Реализация BOOST_CURRENT_FUNCTION
От: igna Россия  
Дата: 03.12.12 10:07
Оценка: +2
Здравствуйте, rg45, Вы писали:

R>Несложные эксперименты в Visual Studio показывают, что все так и есть. __FUNCSIG__ — хитрый такой макрос, который определен как __FSTREXP __FUNCSIG__ (__FSTREXP — пустое макроопределение). Его нельзя ни переопределить, ни отменить. И, как видно, "валиден" и "определен"- не одно и то же — студия позволяет использовать __FUNCSIG__ в других директивах (в т.ч. и для определения других макросов). Но при попытке развернуть его до строкового значения вне функции вызывает ошибку компиляции: "'__FUNCSIG__': predefined macro cannot appear outside of a function body".


На всякий случай хочу заметить, что из этих экспериментов не следует, что __FUNCSIG__ документированно определен вне функции.
Re[11]: Реализация BOOST_CURRENT_FUNCTION
От: Vain Россия google.ru
Дата: 03.12.12 21:00
Оценка:
Здравствуйте, igna, Вы писали:

I>Но я б на это не полагался, документация оставляет вопрос открытым, определен ли __FUNCSIG__ вне функции. Нет же в стандарте ограничения, что любой нестандартный предопределенный макрос должен быть либо не определен, либо определен везде.

тогда бы компилятор не смог скомпилировать свой же отпроцешшеный код
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[15]: Реализация BOOST_CURRENT_FUNCTION
От: Vain Россия google.ru
Дата: 04.12.12 02:16
Оценка:
Здравствуйте, igna, Вы писали:

V>>макрос должен быть определён или неопределён до стадии препроцессора, там не никаких функций ещё

I>Где такое написано? По крайней мере есть __FILE__ и __LINE__, которые хоть и определены везде, но меняют значение. Это конечно не одно и тоже, переопределить макрос и "разопределить" его, но достаточно близкие вещи. Если компилятору вздумается поиметь предопределенный макрос, определенный не везде, стандарту это противоречит не будет.
незнаю на счёт стандарта, но думаю стейджы определены де факто: сначало препроцессор, потом компилятор с линкером
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[13]: Реализация BOOST_CURRENT_FUNCTION
От: Vain Россия google.ru
Дата: 04.12.12 02:20
Оценка:
Здравствуйте, igna, Вы писали:

I>На всякий случай хочу заметить, что из этих экспериментов не следует, что __FUNCSIG__ документированно определен вне функции.

но и того что это распространяется на ifdef тоже не следует
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[15]: Реализация BOOST_CURRENT_FUNCTION
От: Erop Россия  
Дата: 04.12.12 02:39
Оценка:
Здравствуйте, igna, Вы писали:

I>Где такое написано? По крайней мере есть __FILE__ и __LINE__, которые хоть и определены везде, но меняют значение. Это конечно не одно и тоже, переопределить макрос и "разопределить" его, но достаточно близкие вещи. Если компилятору вздумается поиметь предопределенный макрос, определенный не везде, стандарту это противоречит не будет.


Тут есть проблемы с логической моделью.
Пока ты не проведёшь макроподстановки, ты не сможешь понять внутри ты определения функции находишься или нет, а пока не сможешь понять, не сможешь провести макроподстановки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Реализация BOOST_CURRENT_FUNCTION
От: Vamp Россия  
Дата: 04.12.12 21:06
Оценка:
I>А это что означает: "Valid only within a function"?
А это же разные вещи. Допустим, FUNCSIG определен только внутри функции (что автоматически значит, что он раскрывается не пре-процессором, а компилятором).
Но банальный #ifdef — то точно выполняется препроцессором!! И на этом этапе, если FUNCSIG еще не определен, то и ifdef вернет false.
Сами себя перехитрили.
Да здравствует мыло душистое и веревка пушистая.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.