6

従来のC++(「NULL」を使用したC ++コード)と新しいC ++ 11標準(「nullptr」を使用したC ++コード)の両方でコードをコンパイルできるようにしたい

私はGCCを使用していますが、最も重要なことを終えるときに、VS用にもコードベース全体を再コンパイルすることを計画しています。

GCCとVSの両方が次のようなことをすることを期待する必要があります

#define NULL nullptr

または、自分でそれを行う方が良いですか(もちろん、別の名前を使用します。MY_LIBはライブラリのサフィックスに置き換えられます)。

#ifndef nullptr
    #define MY_LIB_NULL NULL
#else
    #define MY_LIB_NULL nullptr
#endif

私が達成したいのは、C ++ 11機能が実装されているかどうかに関係なくコンパイルされるコードです(テンプレートを使用していないため、テンプレートはほとんどありません)。

たとえば、キーワード「override」と「final」はすでに実行されています。

MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL    //macro, defines to "final" if c++11 is present.

「nullptr」の質問は少し奇妙だとわかっているので、質問をしているので、オーバーライドとファイナルですでに行ったのと同じことをするのは間違っているかもしれません。それについての意見が必要です。どんな助けでも大歓迎です。

4

3 に答える 3

4

おそらく、次の方法で「false」my_nullptrタイプを作成できます。my_nullptr_t

const class my_nullptr_t
{
    public:

        /* Return 0 for any class pointer */
        template<typename T>
        operator T*() const
        {
            return 0;
        }

        /* Return 0 for any member pointer */
        template<typename T, typename U>
        operator T U::*() const
        {
            return 0;
        }

        /* Safe boolean conversion */
        operator void*() const
        {
            return 0;
        }

    private:

        /* Not allowed to get the address */
        void operator&() const;

} my_nullptr = {};

これは C++03 と C++11 で動作し、どの C++11 機能が実装されていても常に安全です。その解決策は、公式提案に基づいたのバージョンを提案したこのトピックで実際に既に議論されています。nullptr_t

于 2012-12-03T15:26:38.000 に答える
1

NULLNULL ポインター定数に展開されるマクロです。以前と同じように機能します。C++11 以外のコンパイラで動作する必要があるコードでは、 を使用する必要がありますNULL

于 2012-12-03T14:23:33.270 に答える
0

私は次のように動作すると思います:

#include <cstddef>

#ifndef MY_LIB_NULL
    #ifndef NULL //check for NULL
        #define MY_LIB_NULL nullptr
    #else
        #define MY_LIB_NULL NULL ///use NULL if present
    #endif
#endif

基本的に「NULL」をチェックします。これはマクロであり、コンパイラーがそのマクロと共に出荷されるまで (おそらくそうである可能性があります)、コンパイラーが「nullptr」のみを提供し、もはや NULL を持たない場合、マクロを使用して有効であるよりも、チェックすることができます nullptr が使用されます (おそらく遠い未来ですが、NULL を引き続き使用できるようです!)

「nullptr」を再定義するよりも安全だと思います(ほとんどの人がやろうとしているように)

于 2012-12-03T08:44:56.477 に答える