Межплатформенное определение #define для макросов __FUNCTION__ и __func__ - PullRequest
19 голосов
/ 17 февраля 2010

Компиляция с gcc 4.4.2 и WinXP Visual Studio C ++ 2008

#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif

Как я хочу использовать макрос для отображения имени функции. Я сделал выше, чтобы я мог кросс-платформенный и использовать тот же func при компиляции на Linux или Windows.

Однако, когда я компилирую на WinXP, я получаю следующую ошибку:

__func__ undeclared identifier

Разве я не могу # определить макрос как этот?

Большое спасибо за любые предложения,

Ответы [ 4 ]

25 голосов
/ 17 февраля 2010

Похоже, у вас есть #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";
Появилось

, где имя-функции - это имя лексической функции.

6 голосов
/ 17 февраля 2010

Макрос __FUNCTION__ предопределен в компиляторе MSVC. Вам нужно, чтобы это выглядело так:

#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif

Или наоборот, если вы предпочитаете:

#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
2 голосов
/ 17 февраля 2010

Вы должны иметь возможность использовать __func__ без каких-либо явных макросов в любом компиляторе, который поддерживает C99.

1 голос
/ 17 февраля 2010

Можно, конечно, #define такой макрос.Каждый экземпляр FUNCTION затем заменяется на __func__.Однако, очевидно, ваш компилятор не знает __func__.Я считаю, что VC знает __FUNCTION__, так что

#if defined ( WIN32 )
#  define __func__ __FUNCTION__
#endif

может сделать.

...