在C ++中使用#undef

时间:2011-08-11 19:49:31

标签: 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

2 个答案:

答案 0 :(得分:10)

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

如果先前将extern "C" {定义为由#define __BEGIN_DECLS extern "C" {以外的其他内容替换,则{{1}}将无效且程序将格式不正确。

  

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

肯定会有。

答案 1 :(得分:2)

不是真的。如果您正在调用的另一个库使用相同的名称,则该名称已经定义。

因此,由于您无法通过其他定义对其进行定义,因此首先调用#undef然后调用#define

有时使用#ifdef#ifndef

是合适的