Межплатформенное определение #define для макросов __ ФУНКЦИОНИРУЕТ __ и __ func __

Компиляция с gcc 4.4.2 и WINXP VISUAL STUDIO C ++ 2008

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

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

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

__func__ undeclared identifier

Могу я не #define макрос как это?

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

19
задан congusbongus 1 March 2013 в 02:51
поделиться

4 ответа

Похоже, у вас обратная сторона #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 __ [] = "имя-функции"; 
 

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

25
ответ дан 30 November 2019 в 03:48
поделиться

Макрос __ FUNCTION __ предварительно определен в компиляторе MSVC. Вы должны будете заставить его быть похожим на это:

#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif

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

#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
6
ответ дан 30 November 2019 в 03:48
поделиться

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

2
ответ дан 30 November 2019 в 03:48
поделиться

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

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

может подойти.

1
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: