Макрос __func__

205
25 апреля 2018, 06:24

Переношу проект на более старые зависимости для поддержки более старых ОС, начиная с Windows 7、но тут появляется проблема при переносе, в 2017 версии я тянул имена функций через макрос __func__, но в 2010 версии мне выдает:

error C2065: '__func__`' : undeclared identifier

Можно ли как то перенести данный макрос, функций просто нереально большое количество, и переписывание каждого имени отнимет очень большое кол-во времени?

UPD: Забыл предупредить, нужно имя функции без префикса класса. т.е. не libvlc::get_errmsg что возвращает макрос __FUNCTION__, а get_errmsg.

Answer 1

В с++ есть __func__, только это не макрос, а специальная встроенная переменная. Для получения недекорированного имени функции в VS можно использовать макрос __FUNCTION__. Причем делать #define __func__ __FUNCTION__ нельзя, так как это приводит к неопределенному поведению. Следует заменить все вхождения __func__ или (лучше) использовать __func__ корректно.

Answer 2

Добавьте определение

#define  __func__  __FUNCTION__

и вам не придется менять весь код :) Пока вы работаете в Visual C++ - это безопасное решение. Можете, если опасаетесь, обвязать его для конкретной версии:

#if _MSC_VER == 1600
#define  __func__  __FUNCSIG__
#endif

В VC++ 2010 нет __func__, но есть __FUNCTION__.

Более информативна, впрочем, замена

#define  __func__  __FUNCSIG__
Answer 3

https://msdn.microsoft.com/en-us/library/b0084kay(v=vs.100).aspx позволяет предположить, что что-нибудь вроде __FUNCTION__:

// Demonstrates functionality of __FUNCTION__, __FUNCDNAME__, and __FUNCSIG__ macros
void exampleFunction()
{
    printf("Function name: %s\n", __FUNCTION__);
    printf("Decorated function name: %s\n", __FUNCDNAME__);
    printf("Function signature: %s\n", __FUNCSIG__);
    // Sample Output
    // -------------------------------------------------
    // Function name: exampleFunction
    // Decorated function name: ?exampleFunction@@YAXXZ
    // Function signature: void __cdecl exampleFunction(void)
}
READ ALSO
Отличия абстрактного класса от интерфейса (abstract class and interface)

Отличия абстрактного класса от интерфейса (abstract class and interface)

Каковы отличия между абстрактным классом и интерфейсом?

205
Найти минимальное число [дубликат]

Найти минимальное число [дубликат]

На данный вопрос уже ответили:

247
JS: Получить html редирект ссылки

JS: Получить html редирект ссылки

Есть ссылка - "https://examplecom"

218
Fancybox 3 добавить навигацию

Fancybox 3 добавить навигацию

Открывается в окне, все в порядкеdiv'ы объединяются в группу, но следующий див можно посмотреть только drag'ом, перетаскиванием

219