C言語標準関数とWin32 APIの併用

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6309
登録日時: 9年前
住所: 千葉県
連絡を取る:

C言語標準関数とWin32 APIの併用

#1

投稿記事 by みけCAT » 9年前

Windows Vista SP2 32ビット、Dev-Cpp4.9.9.2、gcc3.4.2です。
C言語標準関数とWin32 APIを併用することにより、何か不都合が起こるということはあるのでしょうか?
私は、malloc、calloc、realloc、freeを使うと問題が起こると聞いたことがある気がするのですが、
他の関数は大丈夫でしょうか?
併用したい関数は、主にsin、cosなどの数学関数やatoiなどです。
わかる方がいらっしゃいましたら教えていただければ幸いです。
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

tk-xleader

Re: C言語標準関数とWin32 APIの併用

#2

投稿記事 by tk-xleader » 9年前

基本的に、数学関連の関数とかは大丈夫です。問題が起こりそうなものは、次にあげるようなものです。

<stdio.h>
stdio stdout stderr を使うような関数。具体的には…
printf puts putchar scanf gets getcharなど(ワイド文字対応も含め)
<stdlib.h>
exit aboutなど… Windowsプログラムとしては "行儀が悪い" とされています、ですが、緊急時には仕方ないと思います。
malloc 系列… プログラム内だけで使うバッファの確保(たとえば文字列)なら大丈夫ですが、クリップボードなど、一部APIとは相性が悪いです。
<assert.h>
assert … MessageBox()を使った代替を用意するのが便利だと思います。

よく使うもので言えばこんな感じです。他にもありますが、そんなに頻繁に使うものでもないと思います。

アバター
みけCAT
記事: 6309
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: C言語標準関数とWin32 APIの併用

#3

投稿記事 by みけCAT » 9年前

なるほど。
ありがとうございます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
へろりくしょん
記事: 92
登録日時: 10年前
住所: 福岡

Re: C言語標準関数とWin32 APIの併用

#4

投稿記事 by へろりくしょん » 9年前

解決した後でちょっとアレなのですが。
みけCAT さんが書きました:私は、malloc、calloc、realloc、freeを使うと問題が起こると聞いたことがある気がするのですが、
メモリハンドルを必要とする API へ malloc() 等で確保した生のポインタを渡したりするというのであれば、かなりどうかと思いますが。
malloc() 関数等を使用する事にたいして問題があるとは聞いた事はありません。
実際 MFC の内部でも結構 new してたりしますし。
tkmakwins15 さんが書きました:<stdio.h>
stdio stdout stderr を使うような関数。具体的には…
printf puts putchar scanf gets getcharなど(ワイド文字対応も含め)
バッファオーバーランや引数の個数に大してセキュアではないと言うのなら分かりますが、Win32API との併用に何故問題が生じるのでしょうか。
GetConsoleScreenBufferInfo() AllocConsole() 関数などを使い標準出力へ書き出す場合、一般に printf() puts() を利用すると思うのですが。
標準入力を受け取る場合もそうですね。
また、パイプで繋ぐ事を想定した場合でも利用すると思うのですが、どうでしょう。
tkmakwins15 さんが書きました:<assert.h>
assert … MessageBox()を使った代替を用意するのが便利だと思います。
個人の好みの問題だとは思いますが、この場合はデバッグ用に MessageBox() 関数をラップした関数を用意するのでしょうか。
それとも見たい時に書いては消してを繰り返すのでしょうか。 
assert() は assert() だと思うのですが、いわゆる printf() デバッグの代替案ならば、OutputDebugString() 関数を利用するのが良いかと。
gcc 等での振る舞いがどうなのかは、知りませんが。

Win32API と C 言語標準関数との併用での問題を上げるなら、CreateThread() 関数の利用には注意が必要です。
この関数を利用する場合、スレッド関数内でランタイムライブラリを使用すると、メモリリークが発生する事があります。
これは例え、マルチスレッド対応のランタイムライブラリであってもです。

アバター
みけCAT
記事: 6309
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: C言語標準関数とWin32 APIの併用

#5

投稿記事 by みけCAT » 9年前

なるほど。
ありがとうございます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

tk-xleader

Re: C言語標準関数とWin32 APIの併用

#6

投稿記事 by tk-xleader » 9年前

>へろりさん

stdin/stdout を用いる関数については不勉強でした。確かにそのような状況下では問題なく使えるようです。

assertについてですが、gcc では assert に失敗すると、失敗式,ソースファイル名,行番号をstderrに出力してabortします。
Windows API プログラミングにおいては、stderr が出力先として適切ではない場合があることや、abort よりも PostQuitMessage(-1) などのほうが都合のいい場合があるので、置き換えるほうがいいのではないかと提案した次第です。
実際、どのように置き換えるかはさまざまな方法があり、どれがいいかは一概に言えるものでもありませんし…

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: C言語標準関数とWin32 APIの併用

#7

投稿記事 by ISLe » 9年前

tkmakwins15さんはコンソールアプリはウインドウズアプリではないという認識なのでしょうか。
abortの問題はWindows API云々ではなくてサブシステムの問題だと思うのですが。

tk-xleader

Re: C言語標準関数とWin32 APIの併用

#8

投稿記事 by tk-xleader » 9年前

>ISLeさん

コンソールアプリはウィンドウズアプリではないという認識ではありません。printf なども結局はWindows API を最終的に呼び出すということも分かっております。
ただ、今回の質問では、コンソールを出して… というよりも、CreateWindowでウィンドウを生成してメッセージループをまわして… という状況下であると思ったので、そのような場合における事柄を述べました。

アバター
みけCAT
記事: 6309
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: C言語標準関数とWin32 APIの併用

#9

投稿記事 by みけCAT » 9年前

tkmakwins15 さんが書きました:ただ、今回の質問では、コンソールを出して… というよりも、CreateWindowでウィンドウを生成してメッセージループをまわして… という状況下であると思ったので、そのような場合における事柄を述べました。
どっちの状況も考えられます。
Win32 APIによるウィンドウプログラムが主で、補助に数学関数などを使いたい、という場合もあれば、
実験などで簡単なプログラムにするためにコンソールにして、printfやscanfで入出力という場合も考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

tk-xleader

Re: C言語標準関数とWin32 APIの併用

#10

投稿記事 by tk-xleader » 9年前

>みけCATさん

勝手に変な仮定の下で回答してしまい申し訳有りませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る