Я пытаюсь сконфигурировать __ func__ и literal string в C++, и я получаю сообщение об ошибке в GCC (с или без стандартного C++ 11). Например, здесь:
#include <cstdio>
int main(void)
{
printf("%s", __func__ " try #1\n");
printf(__func__ " try #2\n");
return 0;
}
Похоже, что __ func__ на самом деле не является строковым литералом. Кто-нибудь знает, почему это происходит и, может быть, способ решить эту проблему?
Технически __func__
является предопределенным идентификатором. Он никогда не реализовывался как макрос.
Он имеет тип static const char __func__[]
поэтому вы не можете его конкатенировать так, как вы. Конечно, вы можете добавить его в std::string
.
использование
printf("%s try #1\n", __func__);
вместо.
__func__
действительно не является ни строковым литералом, ни макросом. Его спецификация из С++ 11 8.4.1/8
Функция-локальная предопределенная переменная
__func__
определяется так, как если бы определение формы
static const char __func__[] = "function-name ";
были предоставлены
Поэтому вам придется рассматривать его как статический массив, а не строковый литерал; в частности, вы не можете объединить его с другими литералами.
printf("%s%s", __func__, " try #1\n");
printf("%s try #2\n", __func__);
std::string message = __func__ + std::string(" try #3");
__func__
не является тупым строковым макросом. Что не так с просто "% s% s"? Кроме того, что не так с использованием надлежащих инструментов C ++, таких какstd::string
иstd::cout
?__FILE__
и__LINE__
являются макросами, я могу понять, почему OP мог подумать, что__func__
тоже будет.