16

今、typedef キーワードを使用したプログラマーによる新しい型定義について話しています。私の生徒が size_t 型に慣れている限り (たとえば、関数 length() を使用することによって)、それが整数型であると「信じる」ように少し努力する必要がありましたが、それは素晴らしいことだと思います。この型が定義されている場所を示します。

だから、Ubuntu ボックスの /usr/include で多くの grep を実行しましたが、size_t は size_type の再定義であり、metadata_type の再定義であり、これで終わりです。ディレクトリ。最後の「typedef unsigned int metadata_type;」が見つかりません。

/usr/src で、yy_size_t と呼ばれる別の以前のタイプを見つけました...

しかし、いずれにせよ、私は連鎖の終わりにたどり着くことができませんでした。

unsigned int (など) であることを確認するための最終的な定義を見つける場所を知っている人はいますか? ボックスに開発パッケージが入っていない可能性がありますか? この場合、size_t 型を使用してプログラムをコンパイルできるのはなぜですか?

4

5 に答える 5

24

C プリプロセッサ ( ) を使用して標準のインクルード ファイルをcpp手動で展開し、その出力を確認できます。

$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c

cppeven の出力には、コードがどのファイルからインクルードされたかを示すマーカーが含まれていることがわかりますstdlib-expanded.c

于 2012-09-19T08:08:59.620 に答える
6

gccはいくつかのヘッダーを提供し、それはここに関連しています:はそれらのヘッダーの1つであるとsize_t定義されています。stddef.hここでは、たとえば/usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.h。そこの定義size_t

typedef __SIZE_TYPE__ size_t;

__SIZE_TYPE__はコンパイラで事前定義されたマクロです(コンパイラとヘッダーが一致することを保証できます。コンパイラが期待するものは引数に依存します。たとえば、-m32では符号なし32ビットビットであり、-m64では符号なし64です。ビットタイプ-、コンパイラ引数から独立したヘッダーを持つため)。

于 2012-09-19T08:42:14.770 に答える
3

他の人が書いたように、すべてのインクルード ファイルを検索すると、おそらくそれを見つけることができます。ただし、これがほとんどの実装の動作方法であるという事実は保証されていません。

標準では、たとえば、符号なし整数型である必要がある#include <stddef.h>定義を提供する必要があると述べています。しかし、 stddef.hというファイルがファイル システムのどこにでも存在するsize_t必要はないとも述べています。そして、そのようなファイルを提供する実装でさえ、そのファイルには次の行しか含まれていません

#pragma stdlib_stddef_h

上記のプラグマがそのヘッダーに対して標準が規定するものを効果的に提供する場合、完全に準拠します。

つまり、 size_t が符号なし整数型であるのは、ヘッダー ファイルで読み取ることができるためではなく、標準がそうしているためです。

于 2012-09-19T08:33:24.467 に答える
3

完全を期すために、単に C++ に について質問することを検討しましたsize_tか?

#include <iostream>
#include <cstddef>
#include <limits>

int main()
{
    std::cout << "sizeof(size_t) = " << sizeof(std::size_t) << std::endl;
    std::cout << "is size_t an integer? " <<
        (std::numeric_limits<std::size_t>::is_integer ? "yes" : "no")
        << std::endl;
    std::cout << "is size_t signed? " <<
        (std::numeric_limits<std::size_t>::is_signed ? "yes" : "no")
        << std::endl;
}

私にくれます

sizeof(size_t) = 8
is size_t an integer? yes
is size_t signed? no
于 2012-09-19T08:33:39.047 に答える
0

std::size_tで定義されてい<cstddef>ます。http://en.cppreference.com/w/cpp/header/cstddefを参照してください。

于 2016-09-27T06:19:31.303 に答える