在C++中使用#undef

GKE*_*KED 8 c++ c-preprocessor preprocessor-directive

我正在研究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
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 10

#define除非参数列表和替换列表相同,否则不允许使用已定义的宏.

如果__BEGIN_DECLS先前被定义为被其他东西替换extern "C" {,那么#define __BEGIN_DECLS extern "C" {将无效并且程序将是不正确的.

从技术上讲,不应该有任何先前的定义,对吗?

肯定会有.