Компиляция с gcc 4.4.2 и WINXP VISUAL STUDIO C ++ 2008
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
Поскольку я хочу использовать макрос для отображения имени функции. Я сделал вышеупомянутое, таким образом, я могу межплатформенный, и использовать тот же func при компиляции на Linux или окнах.
Однако, когда я компилирую на WinXP I, получают следующую ошибку:
__func__ undeclared identifier
Могу я не #define макрос как это?
Большое спасибо за любые предложения,
Похоже, у вас обратная сторона #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 __
предварительно определен в компиляторе MSVC. Вы должны будете заставить его быть похожим на это:
#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif
Или наоборот, если вы предпочитаете:
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
Вы должны иметь возможность использовать __ func __
без явных макросов в любом компиляторе, поддерживающем C99.
Конечно, вы можете #define
такой макрос. Каждый экземпляр FUNCTION
затем заменяется на __ func __
. Однако очевидно, что ваш компилятор не знает __ func __
. Я считаю, что VC знает __ FUNCTION __
, поэтому
#if defined ( WIN32 )
# define __func__ __FUNCTION__
#endif
может подойти.