小野さん、おはようございます。

On Sat, 13 Jun 2009 10:20:05 +0900
Takashi Ono <[email protected]> wrote:

> 中本さん、おはようございます。
> 
> In message "Re: [ja-dev] 日本語MS Word 6.0/95フィルタ",
> Takashi NAKAMOTO wrote...
> 
>  >> Release にするのはちょっと苦しいかもしれません。maintainer がほとんどわたし一人です
> し、C# 
>  >> とのブリッジや MS-OLE などは mingw で出来ませんから。むしろ Windows ネイティブのコード
> がき
>  >> れいに書かれているかの reference と思っています。
>  >
>  >最近、Windows関係のコードをいじっているので、ちょっとここに興味があります。
>  >MinGWを使うと、きれいに書かれているかのリファレンスになるというのはどういう
>  >ことでしょうか?clでコンパイルが通ったー → OK、でいつも済ませていますが...
>  >それではあんまり奇麗なコードではないのでしょうか。
> 
> 標準に合った正しいコーディングでない場合にも適当に解釈してコンパイルして何もメッセージを出
> さないか、warningを吐くか、エラーを出して停止するかはコンパイラの実装に依存しますので、特
> 定のコンパイラで通ったコードがそのままきれいなコードであるとは限りません。
> 
> optionやプラグマをどう指定しているかにもよりますが、最近経験した例では、関数ポインタとvoid 
> *の間の代入をするとき、gccでは明示的にC形式のキャストまたはreinterpret_castをしないとコン
> パイルが通りません。C++では関数ポインタとオブジェクトへのポインタの互換性を前提にしないの
> でgccのふるまいは正しいのですが、VC++では通るようです。

あら、本当。確かに以下のコードはVC++ではコンパイルが通るけど、g++では通
りませんでした。 p = (void*)func; とする必要があるのですね。OOoをハック
するときにはイベント関連の処理でしばしば関数ポインタに出会うことがあるの
で、今後気をつけます。

#include <iostream>

using namespace std;

int func(int num)
{
  return num + 1;
}

int main()
{
  void *p;
  int (*q) (int);
  int i;

  p = func;
  q = (int (*)(int))p;

  i = (*q)(5);

  cout << i;

  return 1;
}


-- 
Takashi NAKAMOTO <[email protected]>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

メールによる返信