我正在研究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
答案 0 :(得分:10)
除非参数列表和替换列表相同,否则不允许#define
已定义的宏__BEGIN_DECLS
。
如果先前将extern "C" {
定义为由#define __BEGIN_DECLS extern "C" {
以外的其他内容替换,则{{1}}将无效且程序将格式不正确。
从技术上讲,不应该有任何先前的定义,对吧?
肯定会有。
答案 1 :(得分:2)
不是真的。如果您正在调用的另一个库使用相同的名称,则该名称已经定义。
因此,由于您无法通过其他定义对其进行定义,因此首先调用#undef
然后调用#define
。
有时使用#ifdef
或#ifndef
。