Кросс-платформенное определение #define для макросов __FUNCTION__ и __func__
Компиляция с gcc 4.4.2 и WinXP Visual Studio С++ 2008
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
Как я хочу использовать макрос для отображения имени функции. Я сделал это, поэтому я могу использовать кросс-платформу и использовать ту же func при компиляции на linux или windows.
Однако, когда я компилирую на WinXP, я получаю следующую ошибку:
__func__ undeclared identifier
Можно ли #define макрос вроде этого?
Большое спасибо за любые предложения,
Ответы
Ответ 1
Похоже, у вас есть #define
назад. Если вы хотите использовать __func__
на обеих платформах, а WIN32 имеет __FUNCTION__
, но не __func__
, вам нужно сделать это вместо:
#if defined ( WIN32 )
#define __func__ __FUNCTION__
#endif
Может быть лучший способ узнать, нужно ли вам определять __func__
или нет, но этот быстрый хак должен сделать трюк.
Помните, что в компиляторах, которые поддерживают ключевые слова __FUNCTION__
и __func__
, они не являются макросами, поэтому вы не можете сделать следующее (поскольку #ifndef __func__
недопустимо):
#ifndef __func__
#define __func__ __FUNCTION__
#endif
Из спецификации C99:
6.4.2.2 Предопределенные идентификаторы
1 Идентификатор __func__
должен быть неявным образом объявлен переводчиком, как если бы сразу после открытия скобки каждого определения функции объявление
static const char __func__[] = "function-name";
Появился где function-name - имя лексически-охватывающей функции.
Ответ 2
Макрос __FUNCTION__
предварительно определен в компиляторе MSVC. Вам нужно сделать так:
#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif
Или наоборот, если вы предпочитаете:
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
Ответ 3
Вы можете использовать __func__
без явных макросов в любом компиляторе, который поддерживает C99.
Ответ 4
Вы можете, конечно, #define
такой макрос. Каждый экземпляр FUNCTION
затем заменяется на __func__
. Однако, obviosuly ваш компилятор не знает __func__
. Я считаю, что VC знает __FUNCTION__
, поэтому
#if defined ( WIN32 )
# define __func__ __FUNCTION__
#endif
мог бы сделать.