Visual C ++ эквивалент __FILE__, __LINE__ и __PRETTY_FUNCTION__ - PullRequest
19 голосов
/ 14 декабря 2010

Компилятор GCC выдает мне следующие макросы:

  • __FILE__, чтобы я мог распечатать имя файла + каталог.
  • __LINE__, чтобы я мог распечататьномер строки, из которой я печатаю.
  • __PRETTY_FUNCTION__, чтобы я мог распечатать красивое имя функции

Имеет ли Visual C ++ эквивалент этих макросов?Побочный вопрос, являются ли они стандартными для компиляторов C ++?

Ответы [ 8 ]

31 голосов
/ 14 декабря 2010

В VS2008 это:

struct A
{
    bool Test(int iDummyArg)
    {
        const char *szFile = __FILE__;
        int iLine = __LINE__;
        const char *szFunc = __FUNCTION__; // Func name
        const char *szFunD = __FUNCDNAME__; // Decorated
        const char *szFunS = __FUNCSIG__; // Signature

        printf("%s\n", szFile);
        printf("%d\n", iLine);
        printf("%s\n", szFunc);
        printf("%s\n", szFunD);
        printf("%s\n", szFunS);

        return true;
    }
};

int wmain(int argc, TCHAR *lpszArgv[])
{
    A a;
    a.Test(10);
}

напечатает это:

c:\source\test_projects\blah\blah.cpp
14
A::Test
?Test@A@@QAE_NH@Z
bool __thiscall A::Test(int)

(Номер строки "неправильный", так как на самом деле в моем файле было что-то лишнее)

9 голосов
/ 14 декабря 2010

__FILE__ и __LINE__ являются стандартными, и я уверен, что компиляторы Microsoft по существу всегда имели их.

__PRETTY_FUNCTION__ - это функция gcc.

7 голосов
/ 14 декабря 2010

Для большей переносимости при получении текущего имени функции вы можете попробовать BOOST_CURRENT_FUNCTION .

6 голосов
/ 14 декабря 2010

Да, в Visual C ++ они есть или их эквивалент. Смотрите ответы здесь:

В чем разница между __PRETTY_FUNCTION__, __FUNCTION__, __func __? Функция-FUNC / 4384860 # 4384860

Также обратите внимание, что, несмотря на верхний регистр, они не являются макросами. Они переменные.

3 голосов
/ 14 декабря 2010

__FILE__ и __LINE__ являются стандартными с C89.__PRETTY_FUNCTION__ - это GCCism.__func__ - это C99ism, который (в отличие от GCCisms) вполне может быть доступен в Visual C ++;это не совсем то же самое, что __PRETTY_FUNCTION__, но может быть достаточно близко для ваших целей.

2 голосов
/ 14 декабря 2010

Я знаю, что MSVC предлагает __FILE__ и __LINE__, оба из которых являются стандартными макросами.Они также предлагают __FUNCTION__, что, я считаю, то, что вы ищете,

1 голос
/ 14 декабря 2010
  1. Да, Microsoft Visual Studio имеет __FILE__ и __LINE__. Вот еще макросы MSVC .

  2. Оба являются ANSI C ++.

  3. MSVC имеет __FUNCTION__, то есть Microsoft-специфичный.

0 голосов
/ 02 апреля 2019

Используя с constexpr, вы можете использовать это: WHERE macro.

На основе использования:

#include "string/ConstexprString.hpp"

#define S1(x) #x
#define S2(x) S1(x)

// WHERE - const char* const should be used as temporary value
#define WHERE (string::make(__PRETTY_FUNCTION__) + ":" + string::make(S2(__LINE__))).get()

// It is safe to store e.g. `constexpr auto where = WHERE_STR;`
#define WHERE_STR (string::make(__PRETTY_FUNCTION__) + ":" + string::make(S2(__LINE__)))

Пример использования:

    // Called: void (anonymous namespace)::exampleUseCaseWhere(int):18
    std::cout << "Called: " << WHERE << std::endl;

Полный и работающий пример здесь

См:

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