質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

402閲覧

派生データ型の必要性はなんでしょうか??

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/08/03 10:53

size_tやssize_tなどの変数の必要性についてなのですが・・・
派生型

探してみた定義を載せます。

C

1typedef long ssize_t //stddef.h 2 3typedef __sszie_t ssize_t //stdio.h 4typdef __SSIZE_T_TYPE __ssize_t // types.h 5#define __SSIZE_T_TYPE __SWORD_TYPE ..typesizes.h 6 7typedef int __sig_atomic_t //sigset.h 8typedef __sig_atomic_t sig_atomic_t //signal.h 9 10#define __SIZE_TYPE__ long unsigned int //stddef.h 11typedef __SIZE_TYPE__ size_t

うう〜〜ん
正直、型を覚えるのが大変面倒です。
sig_atomic_tとかシグナルの時にしか使用しなさそうですし・・・・
volatile int と記述すれば良いのではないでしょうか?
SIG31-C. シグナルハンドラ内で共有オブジェクトにアクセスしない

これらの型が存在している理由は何でしょうか?
typedefやdefineされているだけなら、普通の変数で良いような気がします。
不要ではないですか??

探した環境は Linux 64bit GCC glibcです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これらの型が存在する理由は、移植性を高めるためです。

ポインタのサイズや取りうるメモリのサイズはマシンごとに異なるので、intlongといった型で書いてしまうと「環境が違うときにサイズが合わない」ということになってしまいます。そのため、必要なサイズに合わせたsize_tptrdiff_tを用意して、差を吸収しています。

投稿2017/08/03 12:42

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/08/03 12:47

typedef やdefineしただけでどうして差分を吸収できるんですか?
yumetodo

2017/08/03 12:48

同じ理由でstdint.hヘッダにint16_t,uint32_tとかの型も定義されていますね。
maisumakun

2017/08/03 12:49

size_tでソースコードを作っておけば、C言語のどの環境に持っていってもそれは「データサイズを表す符号なし整数」という意味になります。
yumetodo

2017/08/03 12:49

>typedef やdefineしただけでどうして差分を吸収できるんですか? 環境A typedef long long int64_t; 環境B typedef __int64 int64_t; となっていれば使う側は int64_t foo; とするだけでいいわけです。
yumetodo

2017/08/03 12:51

これがないと利用者は毎回#ifdefを使ったハックをしないといけなくなり、可読性と移植性(可搬性)が下がります。
strike1217

2017/08/03 12:51

環境A,Bによってライブラリが異なっている・・・ということでしょうか?
yumetodo

2017/08/03 12:53

そうです。処理系によって当然typedefの内容は変わりえるわけです(というか処理系が違うんだからライブラリも普通は違うにきまっている、typedefにかぎらず)。
maisumakun

2017/08/03 12:54

たとえば、今のWindowsやLinuxでも、32ビットでコンパイルするか64ビットにするかによって、データの長さは変わってきます
strike1217

2017/08/03 12:55

では、移植性を考慮しない場合は使用しなくても良いんでしょうか?
yumetodo

2017/08/03 12:56

可読性がないのでやはりだめです。
yumetodo

2017/08/03 12:56

どうしても覚えたくないなら、C++11の文明の利器であるautoによる型推論を使いましょう
maisumakun

2017/08/03 12:57

理屈の上ではそうですが、逆に「いちいちsize_tやsig_atomic_tの実際の型を調べる」ほうが面倒ではありませんか?
strike1217

2017/08/03 12:57

int やlongをそのまま使用するのはもはや時代遅れなのですかね?
yumetodo

2017/08/03 12:59 編集

そうではなく、API/Libraryの戻り値の型に合わせて書く or autoで型推論しましょう、という話。
maisumakun

2017/08/03 12:59

時代遅れというか、ポインタやシグナルなどで使う型は「実際の型と違う型で宣言してしてしまうと、不可解なバグのもとになる」ものなのです。 単なる演算用の変数はintでもlongでも大丈夫です。
strike1217

2017/08/03 13:02

処理系によって違う・・・ 真っ先に思いついたのは linux kernel archディレクトリの中身ですが・・・・ これらの型の定義はglibcの中・・・でしたかな? glibcってコンパイルする際に、処理系によって変えることができるんですか?
maisumakun

2017/08/03 13:03

size_tはコンパイラレベルで決まるものです(sizeof演算子の返り値はsize_tです)。
strike1217

2017/08/03 13:05

linuxカーネルと同じように、アーキテクチャごとに定義してるわけですかね?
yumetodo

2017/08/03 13:06 編集

処理系ってのはコンパイルする環境と言い換えて差し支えないので、コンパイル時のお話です。
yumetodo

2017/08/03 13:06

処理系がターゲットしている実行環境向けに、標準ライブラリは作られています。
yumetodo

2017/08/03 13:07

>maisumakun >たとえば、今のWindowsやLinuxでも、32ビットでコンパイルするか64ビットにするかによって、データの長さは変わってきます はそういう意味です。
strike1217

2017/08/03 13:09

アーキテクチャによって異なるように作られているのはカーネルだけではないんですね。 (カーネルだけかと思っていました。) glibcも同じ要領で作られているんですね!
maisumakun

2017/08/03 13:12

コンパイラは機械語を吐きますので、マシンアーキテクチャに合わせたものが必要です。
yumetodo

2017/08/03 13:15 編集

(削除されたメッセージ)
strike1217

2017/08/03 13:14

あら、もしかしてglibc内ではなくgccの方かな?
yumetodo

2017/08/03 13:14

あ、いや、頓珍漢なこと言ってるのでコメ消ししました
strike1217

2017/08/03 13:17

ああ〜〜。 わかりました。 処理系依存なものはgccの中に含まれ、処理系依存ではない部分はglibcの中に入れることで分割しているわけですね。 「コンパイラは機械語を吐きますので、マシンアーキテクチャに合わせたものが必要です。」 確かにそうですね!
strike1217

2017/08/03 13:18

gccのソースコードもダウンロードしておきますわww
gnaggnoyil

2017/08/03 17:26

C言語規格によって処理系(implementation)というのはC言語のソースを規格準拠に解釈する環境であるので、コンパイルだけでもglibcだけでもありません。
strike1217

2017/08/04 05:33

コンパイルだけでも、glibcだけでもない? どういうことでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問