c++中#undef的使用

Use of #undef in C++

本文关键字:#undef c++      更新时间:2023-10-16

我正在学习一段来自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是合适的。