Подтвердить что ты не робот

Кросс-платформенное определение #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 макрос вроде этого?

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

4b9b3361

Ответ 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

мог бы сделать.