3

XCode では、Visual C++ では size_t の代わりに std::size_t を使用する必要があるようです。#include <cstddef>しかし、コード内ですべてsize_tを変更したくないので、これは苦痛std::size_tです...私のWindowsコードでは、size_t追加のファイルを含めなくても機能します。

既存のコードを XCode で動作させる方法はありますか (おそらく .pch ファイルを使用しますか?)、または GCC/MSVC++ はこの点で根本的に異なり、std::size_tクロスプラットフォームにするためにコードを使用する必要がありますか?

4

3 に答える 3

7

C++03 標準、17.4.1.2.4 によると:

条項 18 から 27 に記載されている場合を除き、各ヘッダー cname の内容は、ISO/IEC 9899:1990 プログラミング言語 C (条項 7) または ISO/IEC で指定されているように、対応するヘッダー name.h の内容と同じでなければなりません。 :1990 プログラミング言語 — 修正条項 1: C の整合性 (第 7 条)、必要に応じて、包含によるかのように。ただし、C++ 標準ライブラリでは、宣言と定義 (C でマクロとして定義される名前を除く) は名前空間 std の名前空間スコープ (3.3.5) 内にあります。

言い換えれば、<cstddef>代わりに使用することを選択すること<stddef.h>で、タイプ size_t が名前空間 std 内にあることを明確に要求しています。

したがって、ここに選択肢があります:

  1. <stddef.h>代わりに使用してください。Jesse Good が提案しているようにsize_t、最上位の名前空間にあります。

  2. 使用<cstddef>して使用しますstd::size_t

  3. cnicutarで提案されて<cstddef>いるように、using 宣言を使用size_tしてトップレベルの名前空間にプルします。

もちろん、1 つのコンパイラ/ライブラリ/プラットフォームの 1 つの特定のバージョンで、それを回避したり、プラットフォームごとに異なるコードを記述したり、すべてを autoconf でラップしたり、コード ジェネレーターや sed を記述したりできるという事実に頼ることができます。ベースのプリプロセッサ、または何でも...しかし、なぜですか?

于 2012-05-30T21:24:20.783 に答える
6

おそらく、これをトップ近くのどこかで言っていますか?

using std::size_t;
于 2012-05-30T20:38:11.357 に答える
4

を使用し#include <stddef.h>ます。

#include <stddef.h>では、との違いは何#include <cstddef>ですか?

<cstddef>はC++ヘッダーであり、名前空間内のすべてのシンボルを定義することが保証されており、グローバル名前空間内のものを定義することstdできます。

<stddef.h>はCヘッダーであり、グローバル名前空間内のすべてのシンボルを定義することが保証されており、名前空間内のものを定義することstdもできます。

したがって、Visual Studioで述べたように、グローバル名前空間に挿入されるため(おそらく「stddef.h」が既に含まれているsize_tため)使用できます。size_tこれを任意のコンパイラで機能させたい場合は、を含めますstddef.h

(ただし、純粋なC ++ファンとして、私は個人的に好みstd::size_tます)。

于 2012-05-30T21:23:49.273 に答える