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

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

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

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

C++

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

Q&A

解決済

2回答

890閲覧

プラットフォームについて

apa

総合スコア68

C

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

C++

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

0グッド

0クリップ

投稿2021/02/09 13:26

プラットフォームについての質問です。
私は現在windowsしかパソコンを持っていないのですが、
例えばwindowsプログラムで使える
windows.hやwinsock.hなどの通信ヘッダーは
macやps4などに渡したとき実行ができなくなるのでしょうか?(windows以外でプログラムを使う場合はwindows系のヘッダーの使用を避けるべきか)
hなどはdllなどに組み込まれたりすると思うのですが気になります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

結論から言えば、 winsock などは mac などでは使えません。 (基本的には。)


異なる実行環境では様々なことが違います。 実行ファイルの形式からして、現在の Windows では PE と呼ばれるフォーマットが一般的ですし、 Linux では ELF が標準的なフォーマットです。 Linux 以外でも Unix 系 OS では ELF を採用しているものが多いようですが、かつては COFF が標準的な地位にありました。

では、異なるプラットフォームに持っていったら絶対に動かないのかというとそういうわけでもなく、 Linux と BSD ではお互いをエミュレーションする仕組みがあったりもします。 Windows でも WSL (WSL2) を導入すれば Linux 用の実行プログラムがコンパイルしなおすことさえなく実行できます。 逆に Windows のソフトを Linux で実行する Wine などといったシステムもあります。

バイナリレベルの互換性ではなく API レベルの互換性を提供する仕組みとしては cygwin も有名です。

ただ、エミュレーション層が間に入ると当然ながら多少は (ときにはかなり大きく) 性能が劣化する場合もあり、基本的にはターゲットとなる実行環境で直接的に実行できる形式であることが望ましくはあります。


例に上がっている winsock はその名前に win と付いていることからも明らかなように Windows の機能の一部としてのソケットのインターフェイスです。 処理の実体は OS (Windows) の中にあり、それを呼出しているだけです。 もちろん Linux などには winsock は存在しません。 (エミュレーターを導入しない限りは。)

これらについて C/C++ で対処するには処理系・実行環境に依存する部分を #ifdef で切り分けて各実行環境向けのプログラムを書くのが伝統的な方法です。 広く使われている大きなソフトを覗いてみれば、膨大な量の切り分けがあることを発見できるでしょう。 そういった切り分けの処理を助けるツールとして autotools などがあります。

あるいは、違いを吸収して様々な環境で使えるようにしているライブラリ (結局はそのライブラリの中で各環境のための切り分けがされているのですが) を運よく見つけることが出来たならそれを活用するのも良い方法でしょう。


たとえば winsock についてだけ言えば、同じものは確かに他の OS にはないのですが、ソケットの基本的な考え方はどれも似通っていて必要になったときに場当たり的に書き換えることが出来なくもないと思います。 (winsock の基本的なデザインは BSD が起源だそうです。) ですが、 winsock 以外の使いたい機能によっては OS ごとに全く違うコンセプトで設計されている場合もあって、そういうときには簡単には置き換えられないかもしれません。

実行環境としてどの程度の範囲を想定するか、将来的に移植するときのことを考えてどのようにプログラムを構成するかというのは個別の判断なので、どうするのが良いとひとことで述べられるようなものではありません。

投稿2021/02/09 16:31

SaitoAtsushi

総合スコア5684

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

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

hidezzz

2021/02/09 21:21 編集

> Linux と BSD ではお互いをエミュレーションする仕組みがあったりもします。 FreeBSDやNetBSDではLinux実行ファイルをそのまま実行できるLinuxエミュレータと呼ばれる機能がありますが、 その逆(Linuxで*BSDの実行ファイルをそのまま実行するようなもの)は無いのではないでしょうか? (自分が調べきれていないだけで、実際に存在するのでしたらすみません。)
apa

2021/02/10 12:36

返信ありがとうございます 理解できました!
guest

0

hなどはdllなどに組み込まれたりすると思うのですが気になります。

そもそも、dllという形式自体がWindows用です。

投稿2021/02/09 13:33

maisumakun

総合スコア146018

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

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

maisumakun

2021/02/09 13:34

> windowsプログラムで使える windows.hやwinsock.hなどの通信ヘッダーは macやps4などに渡したとき実行ができなくなるのでしょうか? はい。
apa

2021/02/10 12:37

返信ありがとうございます 理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問