9

我正在研究 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
4

2 回答 2

10

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

如果__BEGIN_DECLS之前定义为替换为 以外的内容extern "C" {,则#define __BEGIN_DECLS extern "C" {将无效并且程序格式错误。

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

本来可以的,当然。

于 2011-08-11T19:50:58.433 回答
2

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

因此,由于您无法在另一个定义上定义它,因此您首先调用#undef然后#define.

有时使用#ifdef或是合适的#ifndef

于 2011-08-11T19:54:19.077 回答