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 に答える