Есть три подхода, о которых я могу подумать прямо сейчас:
Использование IDE : современная среда разработки должна иметь возможность (возможно, с помощью плагинов) анализировать вашикод во время редактирования и сообщит вам достоверное полное имя любого идентификатора, на который наведен курсор мыши.
Конечно, это не вариант, если вы не используете IDE, и иногда даже IDE могут запутатьсяи предоставит вам неверную информацию.
Используйте компилятор и догадки : Если у вас уже есть догадка, в каком пространстве имен вы могли бы находиться, вы можете определить какой-либо объект, сослаться на него по определенному имени ипосмотрите, компилируется ли код, например, так:
const int Fnord = 1;
const int* Probe = &::solid::guess::Fnord;
Одно предостережение в том, что он может дать неверные результаты, если задействованы using namespace
или анонимные пространства имен.
Использовать препроцессор : большинство компиляторов определяют макрос препроцессора, который сообщает вам имя функции, в которой он используется, который может включать пространство имен;например, на MSVC __FUNCTION__
сделает именно это.Если файл содержит функцию, которая, как вы знаете, будет выполнена, вы можете заставить эту функцию сообщать вам свое авторитетное квалифицированное имя во время выполнения, например:
int SomeFunction(void)
{
printf("%s\n", __FUNCTION__);
}
Если вы не можете использовать стандартный вывод,вы можете сохранить значение в переменной и использовать отладчик для его проверки.
Если вы не можете найти такую функцию, попробуйте определить класс со статическим экземпляром самого себя и поместить код в конструктор.
(К сожалению, я не могу придумать, как проверить значение макроса во время компиляции; мне пришло в голову static_assert
, но его нельзя использовать внутри функций, а __FUNCTION__
не можетиспользоваться снаружи.)
Макрос не стандартизирован, хотя и может не включать пространство имен (или он может вообще не существовать).Например, в GCC __FUNCTION__
даст вам только неквалифицированное имя, и вам придется использовать __PRETTY_FUNCTION__
.
(Начиная с C99 и C ++ 11 существует стандартизированная альтернатива, __func__
, но формат имени функции не указан и может включать или не включать пространство имен. В GCC это не так.)