• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:std::stringを別のコンパイラで使うには?)

std::stringを別のコンパイラで使うには?

このQ&Aのポイント
  • std::stringを別のコンパイラで使う場合の解決策とは?
  • セキュリティ上の問題を回避しながらstd::stringを外部に公開する方法
  • std::stringに関連する自作ソリューションの考え方とコードの最適化

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> 条件2をあきらめて自作しようかなと考えています。 自作したとしても、コンパイラに依存することは避けられません。 > もしくは、条件3をあきらめようかと考えています。 こちらの方がやや現実的です。 コンパイラに依存しないDLLを作るのであれば、C++でなく、Cの関数にした方が融通が利きます。 # DLLから送出された例外も、コンパイラが異なると、どうしようもないですから。 また、すべてをchar*またはwchar_t*にしなくても、モジュールにまたがる部分だけそうすればよいのではないでしょうか。 つまり、DLLの中だけとか、アプリケーション側だけで使う分には、std::stringを好きなだけ使用してもよいと思います。

atushi256
質問者

お礼

回答ありがとうございます。 >> 条件2をあきらめて自作しようかなと考えています。 >自作したとしても、コンパイラに依存することは避けられません。 すいません、よくわからないのですが、何らかの問題が起こるのでしょうか?一般的なコンパイラで通るなら許容したい気持ちはあるのですが。(もちろんテンプレートのままにするつもりはありませんし、仮想関数や例外、継承も使用しないとします。) 唯一気になるのは、参照でstd::stringを渡しているということなのです。具体的な例が思い浮かびませんが、知識不足でいけると確信できない。(もっとも、ポインタに変更してもいいですが。) >> もしくは、条件3をあきらめようかと考えています。 > *以下略* これは確かにそうだと思います。

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> すいません、よくわからないのですが、何らかの問題が起こるのでしょうか?一般的なコンパイラで通るなら許容したい気持ちはあるのですが。 コンパイラが異なれば、マングリングのルールが異なります。 すべてC結合にするならともかく、そうでなければリンクできなくなると思います。 > (もちろんテンプレートのままにするつもりはありませんし、仮想関数や例外、継承も使用しないとします。) 仮想関数や継承はともかく、std::stringを用いているのに例外も使わないのであれば、ほとんどの操作ができなくなります。

atushi256
質問者

お礼

>コンパイラが異なれば、マングリングのルールが異なります。 >すべてC結合にするならともかく、そうでなければリンクできなくなると思います。 なるほど。スタティクライブラリとして結合させればマングリングも大丈夫かなと思っていたのですが、コンパイラが異なるとそれもそうもいかないのか・・・。(たしかに言われてみれば、リンクする側はヘッダーを見て勝手にマングリングした名前で関数呼び出しをするプログラムを生成するけど、リンカで「見つからない」というエラーが出そうな気がします。) > 仮想関数や継承はともかく、std::stringを用いているのに例外も使わないのであれば、ほとんどの操作ができなくなります。 std::stringではなく、例外を出さない独自stringクラスを想定していました。 以上を踏まえると、jactaさんのおっしゃるように条件3をあきらめるのがベストのようですね・・・。(内部ではstd::stringを使うとして。)むー。 #Javaの様なほかの言語に移行しとけばよかったのかなぁ。 #レガシーがなければ移行したのですが。

atushi256
質問者

補足

捕捉にお礼を書くのもどうかと思いますが、条件3をあきらめることで決着がつきました。 どうもありがとうございました。

関連するQ&A

専門家に質問してみよう