C / C ++很酷的宏定义?

时间:2010-02-06 09:33:16

标签: c++ c macros

除了__LINE____FILE__之外,还有其他有用的预定义宏,例如__FUNCTION_NAME__吗?

如果没有,但你知道其他很酷/有用的定义宏(特别是出于调试目的),我很想听听它们。

有人问平台:我在MacOSX上使用gcc / g ++。

7 个答案:

答案 0 :(得分:7)

我可以找到以下内容(C99草案的描述,但我认为它们也可以在C89中找到):

  • __DATE__:预处理翻译单元的翻译日期:一个字符 字符串文字的形式“Mmm dd yyyy”,其中的名称 月份与asctime函数生成的月份相同 如果值小于10,则dd的第一个字符是空格字符 翻译日期不可用,是实施定义的有效日期 应提供。
  • __TIME__:预处理翻译单元的翻译时间:一个字符 形式为“hh:mm:ss”的字符串文字,如同生成的时间 asctime功能。如果没有翻译时间, 应提供实施定义的有效时间。

对于当前函数名称,C99定义__func__,但__FUNCTION_NAME__不是标准宏。另外,__func__不是宏,它是保留的标识符(6.4.2.2p1):

  

标识符__func__应由翻译者隐式声明,如果,   紧跟在每个函数定义的左大括号后面的声明

     

static const char __func__[] = " 函数名称 ";

     

出现,其中 function-name 是词法封闭函数的名称。

如果您正在寻找特定于平台的内容:这是gcc's common predefined macros的列表。我喜欢__COUNTER__,这是一个从0开始的唯一的顺序整数。我认为__INCLUDE_LEVEL__也很酷,但不确定我是否能想到它的用途: - )。

答案 1 :(得分:3)

Common GCC macros.

答案 2 :(得分:2)

此MSDN页面列出了complete set of predefined macros for MSVC

就个人而言,我认为__COUNTER__非常酷。

答案 3 :(得分:2)

您正在寻找的具体内容称为__func__,但它并不完全是一个宏,因为它的含义取决于它所看到的位置。然而,它很有用,看起来像一个宏。

我最喜欢的宏是__STDC_VERSION__,因为它可以让我这样做:

#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
# define inline
# define register
# if __GNUC__ >= 2 || _MSC_VER >= 1300
#  define __func__ __FUNCTION__
# else
#  define __func__ "<unknown>"
# endif
#endif

现在,您可以使用C99关键字inlineregister__func__来声明内容,而无需担心您使用的编译器是否支持该C99功能!实际上,inline的位更复杂,因为有些编译器会定义__inline和其他类似的愚蠢,但是你会得到一般的想法。

此外,可以找到用于识别编译器,操作系统和体系结构的预定义宏的有用列表here

答案 4 :(得分:1)

如果我没弄错的话,__func__不是宏。它基本上是在使用它的任何函数的顶部声明为static const char * const __func__ = "function_name";的名称。您应该使用__func__而不是__FUNCTION_NAME__之类的内容,因为__func__是C99标准的一部分。

答案 5 :(得分:0)

您可以从gcc获取所有常规的预定义宏:

$ gcc -dM -E - < /dev/null

当然,这不包括特殊的宏,如:

__FILE__, __LINE__ and __FUNCTION__.

答案 6 :(得分:0)

我倾向于制作单行条件,例如。

#define ZZ_Slash_for_commenting_out /
#ifdef _DEBUG
#define D_B_O std::cerr
#else
#define D_B_O ZZ_Slash_for_commenting_out/
#endif
    D_B_O << "Your thing here" << endl;