C++ C/C++;很酷的宏定义?
除了C++ C/C++;很酷的宏定义?,c++,c,macros,C++,C,Macros,除了\uuuuuuu LINE\uuuuuu和\uuuu FILE\uuuuu之外,是否还有其他有用的预定义宏,如\uuu FUNCTION\uuu NAME\uuuuuu 如果没有,但您知道其他很酷/有用的定义宏(特别是用于调试目的),我很想听听它们 有人问起了关于平台的问题:我在MacOSX上使用的是gcc/g++。这个MSDN页面列出了最新的平台 就我个人而言,我认为\uuuuu COUNTER\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuu LINE\uuuuuu
和\uuuu FILE\uuuuu
之外,是否还有其他有用的预定义宏,如\uuu FUNCTION\uuu NAME\uuuuuu
如果没有,但您知道其他很酷/有用的定义宏(特别是用于调试目的),我很想听听它们
有人问起了关于平台的问题:我在MacOSX上使用的是gcc/g++。这个MSDN页面列出了最新的平台
就我个人而言,我认为
\uuuuu COUNTER\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它基本上是一个名称,声明为static const char*const\uu func\uu=“function\u name”代码>位于使用它的任何函数的顶部。你应该使用\uuuuu func\uuuuu
而不是像\uuu FUNCTION\u NAME\uuuuu
这样的东西,因为\uuuuu func\uuuuuuuuuu>是C99标准的一部分
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
格式为“Mmm dd yyyy”的字符串文字,其中
月份与asctime
函数生成的月份相同,并且
如果值小于10,dd的第一个字符是空格字符。如果
翻译日期不可用,是实施定义的有效日期
应提供
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
格式为“hh:mm:ss”的字符串文字,如
asctime
功能。如果翻译时间不可用,则
应提供实施规定的有效时间
对于当前函数名,C99定义了\uuuuu func\uuuu
,但\uuuu函数名\uuuu
不是标准宏。此外,\uuuuuu func\uuuuu
不是宏,而是保留标识符(6.4.2.2p1):
标识符\uuuu func\uuuu
应由翻译人员隐式声明,如同,
紧接着每个函数定义的大括号,声明
static const char\uuu func\uuu[]=“函数名”代码>
出现,其中function name是词汇封闭函数的名称
如果您正在寻找特定于平台的内容:下面是一个列表。我喜欢\uuuuu计数器
,它是一个从0开始的唯一顺序整数。我认为\uuuu INCLUDE\u LEVEL\uuuu
也很酷,但我不确定我是否能想到它的用途:-)。您正在寻找的特定的一个名为\uuu func\uuuu
,但它并不完全是一个宏,因为它的含义会随着看到它的位置而变化。但是,它很有用,看起来确实像一个宏
目前我最喜欢的宏是\uuuu STDC\u VERSION\uuuu
,因为它允许我执行以下操作:
#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
#如果!已定义(uu STDC_uu版本)| | uu STDC_uu版本uuu<199901L
#定义内联
#定义寄存器
#如果uuu GNUC uuu>=2 | | | MSC _VER>=1300
#定义函数__
#否则
#定义函数
#恩迪夫
#恩迪夫
现在,您可以使用C99关键字inline
、register
和\uuu func\uuu
来声明内容,而不必担心您使用的编译器是否支持C99功能!实际上,内联
的位更为复杂,因为有些编译器定义了\uu内联
和其他类似的愚蠢行为,但您可以理解其中的大意
此外,还可以找到用于识别编译器、操作系统和体系结构的预定义宏的有用列表。通用GCC您可以从GCC获得所有常规预定义宏,如下所示:
$ gcc -dM -E - < /dev/null
我倾向于做单线条件,比如
#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;
#为注释定义ZZ_斜杠/
#ifdef_调试
#定义D_B_O标准::cerr
#否则
#定义D_B_O ZZ_斜杠_用于注释_/
#恩迪夫
D_B_O这将是特定于平台的。您在哪个平台上?@dirkgently:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我认为还有一些类似宏的东西(代码> >函数-No.NAME.<代码>不是宏),它们也是C和/或C++标准的一部分。因为,他在寻找其他人,所以我的问题是。你错了:C99构造被称为\uuuuu func\uuuu
\uuuu FUNCTION\uuuuu
是MSVC上的一个宏。另外,与我的回答相关的是,如果你的编译器不支持C99,在GCC下,\uuuu GNUC\uuuu
宏的值大于2(或者显然是如果你在MSVC上)您可以通过<代码> >函数>定义函数> <函数> >代码>,得到相同的结果。代码> >“尽管如此,您所说的仍然有其用途。Chris,\uuuuuu LINE\uuuuuu
的含义也会根据它在源代码中的位置而变化,因此名称的扩展取决于它在源代码中的位置并不一定意味着它不能是宏。当然,关于\uuuu func\uuuu
不是宏的说法是对的。如果这样做有效的话,这是一个生成注释表单宏的巧妙技巧!
#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;