2012-04-15 13 views
9

この区別はなぜですか? itoastdlib.hであると仮定し、最終的にitoaというカスタムバージョンを別のプロトタイプにリンクしてしまい、ひどいエラーが発生すると仮定して、ひどい問題が発生しました。atoiは標準機能です。しかしitoaはそうではありません。どうして?

なぜ、itoaは標準機能ではないのですか?どうしたの?そして、その双子の兄弟のための標準的な部分はなぜですかatoi

+11

「atoi」は歴史的ですが、「itoa」はありません。とにかく 'atoi'を使うべきではありません。' strto(u)l(l) 'はあなたが使うべきものです。他の方向については、 's(n)printf'。 –

+0

'itoa'は標準関数ではないので、あなたが議論したいと思う' itoa'関数のインタフェース契約を含めることができますか?(これはあなたの質問に答えるかもしれません) –

+0

@CharlesBailey私は標準がなぜatoiであり、itoaではないのかについて一般に興味があります –

答えて

7

いいえitoa標準に追加するためにこれまでに標準化されていますが、魅力的な理由と追加するインターフェイスが必要です。

ほとんどのitoaインターフェイスでは、再入力と生涯の問題がある静的バッファを使用するか、呼び出し元が解放する必要がある動的バッファを割り当てます。 sprintf

+2

バッファに渡されたitoa()は、ライブラリの特定の部分(printf()ファミリには何もありません)が使用されていない場合、s(n)printfこれは、標準のCライブラリにitoa()を入れる理由ではありませんが、もっと重いものよりも好きな理由です。 –

+0

@JulieinAustin:なぜそれは大きな勝利ですか?確かに、あなたは2つの文字フォーマットの文字列を解析する必要はありませんが、私は_huge_勝利を考慮しません。 –

+2

printf()ファミリで乗ってくる他の解析関数もすべて回避することができます。 覚えている - この人生には、フォーマット文字列の解析以外にも他のものがあります。同様に、メモリフットプリント。 –

2

"itoa"関数は文字列を返す必要があります。文字列はファーストクラスのオブジェクトではないので、呼び出し側はバッファ+長さを渡さなければならず、関数は空き領域を使い切ったかどうかを示す何らかの方法を持たなければなりません。あなたがそれを得るまでには、コード/機能を複製する価値はないので、sprintfに似たようなものを作成しました。 "atoi"機能は、完全な "scanf"呼び出しよりも複雑ではなく(おそらく安全です)、存在します。 「itoa」関数は、それに見合うだけの違いはありません。

+0

実際はありません。多くの開発者は、itoa()のようなルーチンをコードに組み込んでいます。最大バッファサイズは、6バイトの場合は6バイト、NULの場合はスペア、32ビットのボックスの場合は11のスペアがあります。私は、バージョンとステータス情報を含むテキスト文字列をフォーマットするために、データ取得ファームウェアの一部にitoa()関数を使用します。その実装ではポインタを渡しますが、他のバッファは静的であることがわかりました。最もよく説明されているのは、標準のように、たくさんのitoa()実装があります。 –

+0

@JulieinAustin - 彼らは存在しないと言っているのではなく、標準化されていないということだけです。あなたの説明はその理由を示すのに役立ちます。バッファサイズは、マシンのレジスタサイズによって異なります。 C標準委員会は、このようなハードウェア固有の詳細から離れています。標準化された関数は、一貫性のあるインターフェースを持っていなければならず、**すべての**プラットフォームで同じように動作しなければなりません。実用的な唯一の方法は 'printf()'の大部分を再考することです。 – bta

+0

私はあなたの主張に、その機能はあらゆる種類のことをする=持っていると返答していました。実際にはそうではなく、適切な数のイタリム語を使用して実装を簡単に指定して、単語サイズの違いを回避することができます。つまり、任意のワードサイズに対して、そのワードサイズのすべての可能な整数値を表すのに必要な、記憶装置の有名な有限数があります。 TL; DR - あなたが提案するよりはるかに簡単に、より一貫して実装することができます。 –

1

itoa機能が標準ではない可能性があるのは、一貫した定義がないからです。異なるコンパイラとライブラリのベンダーは、おそらくatoiを補完するための発明として、微妙に異なるバージョンを導入しました。

標準以外の機能がベンダーによって広く提供されている場合、標準の仕事はcodifyです。基本的に既存の機能の説明を標準に追加します。これは、関数が多かれ少なかれ一貫した引数の慣習と振る舞いを持つ場合に可能です。

itoaの複数のフレーバーが既に存在するため、このような関数をISO Cに追加することはできません。どのような動作が記述されていても、いくつかの実装では不利になります。

itoaは、以下のような形で存在している:_itoa

void itoa(int n, char *s); /* Given in _The C Programming Language_, 1st ed. (K&R1) */ 

void itoa(int input, void (*subr)(char)); /* Ancient Unix library */ 

void itoa(int n, char *buf, int radix); 
char *itoa(int in, char *buf, int radix); 

マイクロソフト変更された名前の下に彼らのビジュアルCランタイムライブラリでそれを提供します。

Cの実装で歴史的に異なる定義で提供されているだけでなく、C プログラムも、潜在的な衝突の別の原因であるitoaという機能を提供します。

基本的に、itoa識別子は、外部名またはマクロとしての標準化に関して「放射性」である。このような機能が標準化されている場合は、別の名前を使用する必要があります。