アカウント名:
パスワード:
素のprintfはともかく、その子分が長い歴史でchar[] string = sprintf(format, (in_str1, in_str2)); とかPython風の記法にならなかったのが謎。何故に副作用を持つのだ。
上記の例だと関数がメモリ割り当ても行う必要ある?便利感とやりすぎでは感がある
strdup() [linuxjm.osdn.jp]
なるほど。
C言語の中の人のことを正直わかってないのだが、ヘッダファイルで言うとsprintf - stdio.hmalloc - stdlib.hstrdup - string.hらしい。こことかで何かあるのだろうか。stdioはstdlibは使いたくないがstringは気にしないとか
std**.h は Standard *** の略で昔からある基本機能、これを使うことに躊躇う理由は何もないとはいっても string.h を使うのを躊躇う理由も何もないけど、strdup は使わないかなぁ
C 言語を使う理由の1つに「メモリ管理を隠蔽しない」というのがある関わる人全員が「strdup 内で malloc されていて、その戻り値は自分で free しないといけない」と分かっていれば良いけど、その前提は厳しいmalloc したものは free する(あるいは相当するプロジェクト独自関数を使う)、とコーディングルールに定めておくと見通しが良くなります# なお私は自分で管理したくないので C++ 使います
どもども。
stdlib.h、適当に検索したらUNIX v7にstdlibはありませんか?とかいうStackoverflowの翻訳ぽい記事があって、89年ごろは環境によってあったりなかったりしたぽい。stdlib.hが無くてもmallocはあると思うけど。
stdio.hは検索とかしてないけど、stdlib以前に成立してるなら、そのAPI設計は後年stdlibになる関数の依存を薄くすることはありえると思う。sprintfが今の形になったのがそのためかはわからない
ヘッダの成立はともかく、printf にしろ malloc にしろ K&R(ごく初期) の時点で存在する関数ですsprintf が今の引数になっているのは、メモリをプログラマが管理する、という前提を守ったからではないでしょうかこの引数だと書き込む先の領域がスタックでもヒープでもいいので、環境依存も減らせます# ヒープのないマイコンでも動かすために必要だし、と思ったけどそんな環境に sprintf なんて高機能な関数載ってないか……
こんにちは。
K&RC 2版が手元に残ってたんで(初版1989、手持ちは2000頃の版)見てみたけど、strdupも記載があるのはあるね。書きっぷりからユーザー定義関数ぽくて、サンプルプログラムとしてたまたまの登場か、当時の環境でも事実上の標準として存在したのかはちょっとわからないけど。
Arduinoにはsprintfありますね。
Arduinoのプログラムって、uint8_t で十分なところにlongとか下手するとfloatを平気で使ったりして、8bitCPUに何させるの、と、貧乏性の自分には心臓に悪いコードが多いですけど、
ヒープは一応あるけど容量厳しいので、動的メモリ確保(malloc や new)してるコードはほとんど見かけない。C++ベースだけどオブジェクトはグローバル変数として静的に定義するのが基本。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー
解せない標準関数たち (スコア:2)
素のprintfはともかく、その子分が長い歴史でchar[] string = sprintf(format, (in_str1, in_str2)); とかPython風の記法にならなかったのが謎。何故に副作用を持つのだ。
Re: (スコア:0)
上記の例だと関数がメモリ割り当ても行う必要ある?
便利感とやりすぎでは感がある
Re: (スコア:0)
strdup() [linuxjm.osdn.jp]
Re: (スコア:0)
なるほど。
C言語の中の人のことを正直わかってないのだが、ヘッダファイルで言うと
sprintf - stdio.h
malloc - stdlib.h
strdup - string.h
らしい。こことかで何かあるのだろうか。stdioはstdlibは使いたくないがstringは気にしないとか
Re: (スコア:0)
std**.h は Standard *** の略で昔からある基本機能、これを使うことに躊躇う理由は何もない
とはいっても string.h を使うのを躊躇う理由も何もないけど、strdup は使わないかなぁ
C 言語を使う理由の1つに「メモリ管理を隠蔽しない」というのがある
関わる人全員が「strdup 内で malloc されていて、その戻り値は自分で free しないといけない」と分かっていれば良いけど、その前提は厳しい
malloc したものは free する(あるいは相当するプロジェクト独自関数を使う)、とコーディングルールに定めておくと見通しが良くなります
# なお私は自分で管理したくないので C++ 使います
Re:解せない標準関数たち (スコア:0)
どもども。
stdlib.h、適当に検索したらUNIX v7にstdlibはありませんか?とかいうStackoverflowの翻訳ぽい記事があって、89年ごろは
環境によってあったりなかったりしたぽい。stdlib.hが無くてもmallocはあると思うけど。
stdio.hは検索とかしてないけど、stdlib以前に成立してるなら、そのAPI設計は後年stdlibになる関数の依存を薄くすることは
ありえると思う。sprintfが今の形になったのがそのためかはわからない
Re: (スコア:0)
ヘッダの成立はともかく、printf にしろ malloc にしろ K&R(ごく初期) の時点で存在する関数です
sprintf が今の引数になっているのは、メモリをプログラマが管理する、という前提を守ったからではないでしょうか
この引数だと書き込む先の領域がスタックでもヒープでもいいので、環境依存も減らせます
# ヒープのないマイコンでも動かすために必要だし、と思ったけどそんな環境に sprintf なんて高機能な関数載ってないか……
Re: (スコア:0)
こんにちは。
K&RC 2版が手元に残ってたんで(初版1989、手持ちは2000頃の版)見てみたけど、strdupも記載があるのはあるね。
書きっぷりからユーザー定義関数ぽくて、サンプルプログラムとしてたまたまの登場か、当時の環境でも
事実上の標準として存在したのかはちょっとわからないけど。
Re:解せない標準関数たち (スコア:1)
Arduinoにはsprintfありますね。
Arduinoのプログラムって、uint8_t で十分なところにlongとか下手するとfloatを平気で使ったりして、
8bitCPUに何させるの、と、貧乏性の自分には心臓に悪いコードが多いですけど、
ヒープは一応あるけど容量厳しいので、動的メモリ確保(malloc や new)してるコードはほとんど見かけない。
C++ベースだけどオブジェクトはグローバル変数として静的に定義するのが基本。