除了__LINE__
和__FILE__
之外,还有其他有用的预定义宏,例如__FUNCTION_NAME__
吗?
如果没有,但你知道其他很酷/有用的定义宏(特别是出于调试目的),我很想听听它们。
有人问平台:我在MacOSX上使用gcc / g ++。
答案 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关键字inline
,register
和__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;