c++中#undef的使用
Use of #undef in C++
我正在学习一段来自GSL库的代码,并且对头文件开头的几行感到困惑。我明白#undef #ifdef等的作用但我不明白的是为什么他们基本上重置了_BEGIN_DECLS的定义然后继续重新定义它?从技术上讲,不应该有任何之前的定义,对吧?我的意思是,这些东西是静态的,不会改变。无论如何,下面是代码的摘录:
#undef __BEGIN_DECLS
#undef __END_DECLS
#ifdef __cplusplus
# define __BEGIN_DECLS extern "C" {
# define __END_DECLS }
#else
# define __BEGIN_DECLS /* empty */
# define __END_DECLS /* empty */
#endif
除非参数列表和替换列表相同,否则不允许对已经定义的宏进行#define
。
如果__BEGIN_DECLS
之前被定义为用extern "C" {
以外的东西代替,那么#define __BEGIN_DECLS extern "C" {
将是无效的,程序将是病态的。
技术上讲,不应该有任何先前的定义,对吗?
不完全是。如果您正在调用的另一个库使用相同的名称,则该名称已被定义。
因此,由于您不能在其他定义上定义它,因此您首先调用#undef
,然后调用#define
。
有时使用#ifdef
或#ifndef
是合适的。