C ++ Concatinating __func__ и константный литерал

0

Я пытаюсь сконфигурировать __ 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__ на самом деле не является строковым литералом. Кто-нибудь знает, почему это происходит и, может быть, способ решить эту проблему?

  • 3
    Конечно, __func__ не является тупым строковым макросом. Что не так с просто "% s% s"? Кроме того, что не так с использованием надлежащих инструментов C ++, таких как std::string и std::cout ?
  • 1
    @Griwes "Конечно"? Учитывая, что __FILE__ и __LINE__ являются макросами, я могу понять, почему OP мог подумать, что __func__ тоже будет.
Показать ещё 6 комментариев
Теги:
function
macros

2 ответа

2
Лучший ответ

Технически __func__ является предопределенным идентификатором. Он никогда не реализовывался как макрос.

Он имеет тип static const char __func__[] поэтому вы не можете его конкатенировать так, как вы. Конечно, вы можете добавить его в std::string.

использование

printf("%s try #1\n", __func__);

вместо.

  • 0
    Спасибо за объяснение о __func__. Я действительно думал об использовании __func__ как строкового литерала, теперь я вижу, что это невозможно.
5

__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");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню