Для чего нужен __FUNCT__? - PullRequest
       17

Для чего нужен __FUNCT__?

1 голос
/ 14 января 2012

Я искал пример кода PETSc и наткнулся на этот фрагмент:

#undef __FUNCT__
#define __FUNCT__ "main"

прямо перед началом main.

Является ли настройка __FUNCT__ или что-то подобное перед каждой функцией (или только основной?) Стандартным соглашением по программированию на C?

Если так, почему это сделано?

Ответы [ 4 ]

4 голосов
/ 18 сентября 2013

из комментариев в исходном коде PETSc (${PETSC_DIR}/src/snes/examples/tutorials/ex3.c, строки 33-40):

Обратите внимание, что непосредственно перед каждой процедурой ниже, мы определяем макрос __FUNCT__ как строку, содержащую имя процедуры. Если определено, этот макрос используется в обработчиках ошибок PETSc, чтобы обеспечить полный возврат имен рутины. Все функции библиотеки PETSc используют это макрос, и пользователи могут также использовать его в своем приложении коды. Обратите внимание, что пользователи могут получить трассировку ошибок PETSc независимо от определяют ли они __FUNCT__ в кодах приложения; этот макрос просто предоставляет дополнительную информацию о трассировке имен подпрограмм приложения.

3 голосов
/ 14 января 2012

Глядя на petsc.h , кажется, что есть куча макросов, которые передают __FUNCT__ в качестве параметра функции, например:

#define PetscFree(a)   ((a) ? ((*PetscTrFree)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__) || ((a = 0),0)) : 0)

Я предполагаю, чтоPetscTrFree() (и т. Д.) Принимают эти аргументы в целях отладки / ведения журнала.

2 голосов
/ 14 января 2012

Это выглядит как сокращение или обходной путь для компилятора C, который не поддерживает стандартный макрос __FUNCTION__.

1 голос
/ 14 января 2012

Сначала все предыдущие объявления __FUNCT__ игнорируются компиляцией с использованием #undef, затем идентификатор объявляется снова и устанавливается в строку "main" в строке #define __FUNCT__ "main"

Лично я никогда не видел, чтобы кто-нибудь делал это, устанавливая его в "main", я вижу, что это полезно, если вы хотите использовать библиотеку или что-то, но не хотите использовать объявленное ими имя функции, конечно, я не Не знаю, почему вы бы сделали этот идентификатор идентификатором, вместо того, чтобы просто создавать другую функцию, принимающую те же параметры и называть ее как угодно.

В любом случае, я не верю, что это стандартное соглашение по программированию на C, и из ограниченного фрагмента кода неясно, для чего именно оно используется или почему оно выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...