Как заставить замолчать GCC педантичное (-Wpedantic) предупреждение относительно __FUNCTION__ - PullRequest
0 голосов
/ 24 октября 2018

Я печатаю (printf) имя функции, когда я вхожу в нее, используя предопределенный макрос «__FUNCTION__» (в gcc и clang).Однако, если я использую -Wpedantic, я получаю это предупреждение:

предупреждение: ISO C не поддерживает предопределенный идентификатор '__FUNCTION__' [-Wpedantic]

Как мнемолчать это предупреждение?

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Стандартный совместимый идентификатор функции: __func__

Из §6.4.2.2 спецификации C11

Идентификатор __func__ должен быть неявно объявлен переводчиком, как если бысразу после открывающей фигурной скобки каждого определения функции появилось объявление
static const char __func__[] = "function-name";
, где имя-функции - это имя лексически-заключающей функции.

Я считаю, что__func__ был добавлен в C99.

0 голосов
/ 24 октября 2018

Нет смысла использовать __FUNCTION__.

__func__ является стандартным (C99, C11 , C17).C11 6.4.2.2p1:

  1. Идентификатор __func__ должен быть неявно объявлен транслятором, как если бы сразу после открывающей скобки каждого определения функции было объявлено

    static const char __func__[] = "function-name";
    

Из документации GCC :

__FUNCTION__ - другое имя для __func__, предоставленное для обратной совместимостисо старыми версиями GCC.

И если вы хотите узнать, сколько лет, __func__ появился в GCC 2.95 , выпущен 31 июля 1999 .Имейте в виду, вам не нужно __FUNCTION__ для чего-либо еще , но для поддержки GCC 2.94 или более ранней версии .Если вы это сделаете, то это предупреждение, вероятно, меньше всего вас беспокоит.


Однако __func__ также недоступен в режиме C89 / 90, поэтому вы получите предупреждение там.Если вам небезразлична диагностика ISO, вам нужно использовать более новую версию.Современные GCC по умолчанию уже используют GNU C11 или C17.


См. Также: В чем разница между __PRETTY_FUNCTION__, __FUNCTION__, __func__

0 голосов
/ 24 октября 2018

Параметр -Wpedantic используется для:

выдачи всех предупреждений, требуемых строгими стандартами ISO C и ISO C ++;отклонить все программы, которые используют запрещенные расширения, и некоторые другие программы, которые не соответствуют ISO C и ISO C ++.Для ISO C следует версии стандарта ISO C, указанной любой используемой опцией -std.

__FUNCTION__ является расширением GCC.Однако __func__ является предопределенным идентификатором в C11.Я понимаю, что это тоже часть C99.

В проекте комитета для C11 (N1570) говорится, что:

6.4.2.2 Предопределенные идентификаторы
Семантика
1. Идентификатор __func__ должен быть неявно объявлен переводчиком, как если бы сразу после открывающей скобки каждого определения функции появилось объявление

static const char _ _func_ _[] = "function-name";

, где имя-функции - это имялексической функции.

0 голосов
/ 24 октября 2018

Не используйте -Wpedantic, если не пытаетесь придерживаться стандарта ANSI C, который явно не поддерживает ключевое слово __FUNCTION__.

Вместо этого используйте -Wall -Wextra.

...