LINUX.ORG.RU

C и __FUNCTION__ ?


0

0

Почему строчка:
 printf("error at " __FUNCTION__);
вызывается ошибку (error: syntax error before string constant)
при компиляции? Насколько я понимаю, __FUNCTION__ -- макрос, 
который "раскрывается" в имя current функции в кавычках.

Естественно, это работает в следующем случае:
 printf("error at %s ", __FUNCTION__);

но меня интересует именно первый вариант. Спасибо.
anonymous

> Насколько я понимаю, __FUNCTION__ -- макрос, который "раскрывается" в имя current функции в кавычках.

Так было раньше. По C99 это не литерал, а массив символов.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Так было раньше. По C99 это не литерал, а массив символов.

Ясно. Мне хотелось бы реализовать примерно следующее, используя препроцессор: printf("Error at " __FILE__ "::" __FUNCTION__); ==> printf("Error at " "main.c" "::" "main");

Это реализуемо? Спасибо.

anonymous
()
Ответ на: комментарий от tailgunner

> #define ERR(errmsg)

Спасибо, это понятно изначально, что так можно :). Меня интересует именно вариант __FILE__ __func__ => "<filename>" "<function". Ибо данная строка будет передаваться в функцию(char*). Т.е. меня интересует именно независимость от стандартных *printf() с возможностью задания сторонней функции, например, опять же с помощью макросов.

anonymous
()
Ответ на: комментарий от tailgunner

Можно поподробнее? Если __FUNCTION__ - макрос, значит он определяется препроцессором. С каких это пор препроцессор стал таким умным, что начал парсить функции? Имхо __FUNCTION__, __func__ и прочие маленькие радости не могут быть литералами по определению.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> Если __FUNCTION__ - макрос

Это не макрос, и никогда не был. Людей вводит в заблуждение его похожесть на __FILE__ и __LINE__.

> С каких это пор препроцессор стал таким умным, что начал парсить функции?

__FUNCTION__ не имеет отношения к препроцессору.

> Имхо __FUNCTION__, __func__ и прочие маленькие радости не могут быть литералами по определению.

Реальность с тобой не согласна :) - для людей, пишущих компилятор, нет ничего невозможного :D Хотя __func__ - в самом деле не литерал.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Как-то ты непонятно выражаешься. Тебя интересуе token pasting (склейка строк-литералов)? Я же сказал, что __func__ - это не литерал. Или о чем ты?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Как-то ты непонятно выражаешься.

Да, прошу прощения за невнятность. Попробую выразить это с помощью кода. Хочется реализовать следующее:

#define ERROR_INFO "error at " __FUNCTION__ ", line: " __LINE__

...

if (!condition) show_info(ERROR_INFO); // Где: show_info(char* );

Т.е. меня интересует, что бы в результатом работы макроса ERROR_INFO была строка символов. Спасибо.

anonymous
()
Ответ на: комментарий от tailgunner

коряво :

char* inline ERROR_INFO_FUNCTION () { #define sz 1024 static char tmp[sz]; snprintf(tmp, sz, "...",...); return tmp; }

#define ERROR_INFO ERROR_INFO_FUNCTION()

anonymous
()
Ответ на: комментарий от dilmah

> это вполне приемлемо

приемлемо для чего? возвращать указатели на статические массивы - это теперь нормально? ок, но что этим достигается?

> и решает вопрос автора топика.

это какие-то каракули на манжетах, а не код - они ничего не могут решать.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> коряво :
> char* inline ERROR_INFO_FUNCTION () { #define sz 1024 static char tmp[sz]; snprintf(tmp, sz, "...",...); return tmp; }

интересно, и как это будет работать в многопоточной среде?
hint: никак не будет работать.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> интересно, и как это будет работать в многопоточной среде?

Обычно - будет. Но в самый неподходящий момент - сглючит.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Обычно - будет. Но в самый неподходящий момент - сглючит.

не бывает - обычно или необычно. если он может упасть - он это сделает совершенно точно рано или поздно -> работать это не будет. без всяких допущений "а может быть" или "как правило".

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> не бывает - обычно или необычно.

Бывает. Это - как раз рассматриваемый случай - будут затираться сообщения об ошибках, если эти ошибки возникли "почти одновременно", что случается редко.

> если он может упасть

Не может. Худшее, что случится - затирание сообщения об ошибке.

P.S. что ты злой такой сегодня?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Бывает. Это - как раз рассматриваемый случай - будут затираться сообщения об ошибках, если эти ошибки возникли "почти одновременно", что случается редко.

ладно, граничные условия решения указали - дальше сам пусть думает что и как.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от tailgunner

> возвращать указатели на статические массивы - это теперь нормально?

для однопоточной -- абсолютно нормально.

Про много потоков автор топика ничего не говорил. В рамках стандартного С/С++ их вообще нет.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> Про много потоков автор топика ничего не говорил.

Про их отсуствие - тоже.

И смешно обсуждать код вида 'snprintf(tmp, sz, "...",...);'.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> И смешно обсуждать код вида 'snprintf(tmp, sz, "...",...);'.

на сцене клоуны.. Что смешного то?

disclaimer: я не тот анонимус, я просто его адвокат.

dilmah ★★★★★
()
Ответ на: комментарий от tailgunner

> ОК, объясни мне, что делает snprintf(tmp, sz, "...",...)

неужели непонятно, что вместо "..." нужно подставить форматную строку, а дальше ставить те аргументы которые хочешь вывести?

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

>> ОК, объясни мне, что делает snprintf(tmp, sz, "...",...)

>неужели непонятно, что вместо "..." нужно подставить форматную строку, а дальше ставить те аргументы которые хочешь вывести?

Я знаю, что делает функция snprintf, спасибо. Только вот не знаю, какой должен быть формат и какие именно параметры подставить. Знаешь - опубликуй.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Я знаю, что делает функция snprintf, спасибо. Только вот не знаю, какой должен быть формат и какие именно параметры подставить. Знаешь - опубликуй.

не нравится не смотри. я те ничего не подношу на блюдечке с голубой каемочкой.

идея ясна? напильник в руки и вперед

anonymous
()
Ответ на: комментарий от anonymous

> я те ничего не подношу на блюдечке с голубой каемочкой.

Ты предложил этот код в качестве решения проблемы или у тебя просто графомания?

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.