プラットフォームについての質問です。
私は現在windowsしかパソコンを持っていないのですが、
例えばwindowsプログラムで使える
windows.hやwinsock.hなどの通信ヘッダーは
macやps4などに渡したとき実行ができなくなるのでしょうか?(windows以外でプログラムを使う場合はwindows系のヘッダーの使用を避けるべきか)
hなどはdllなどに組み込まれたりすると思うのですが気になります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア5684
0
hなどはdllなどに組み込まれたりすると思うのですが気になります。
そもそも、dllという形式自体がWindows用です。
投稿2021/02/09 13:33
総合スコア146018
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/09 21:21 編集
2021/02/10 12:36