ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[C言語] C言語 index関数

 
warning: conflicting types for built-in function 'index'
という警告について海外の電子掲示板に情報があった。
以下、訳ミスがあるかも。

Re: conflicting types
26-Jul-2007, 09:37 davekw7x
http://www.gidforums.com/t-15067.html

There is no standard C library function named index. Never has been (not in our beloved K&R, either). There is, however a "legacy" UNIX function named index (from BSD, I'm thinking, but don't quote me on that).
Now, there is a specification of <stdio.h> and a listing of functions therein in both the C89 and C99 standards.

index と名付けられた標準のCライブラリ関数は存在しません。これまでも存在したことはありません。(私達の最愛のK&Rにもありません)。しかし、index と名付けられたレガシーのUNIX関数があります(BSD からと、私は考えているけれども、それにおいて私を引用しないで下さい)。現在、stdio.h の仕様およびその中の関数のリストが、C89とC99標準にあります。

My feeling is that if a C compiler vendor supplies any library functions beyond the standard C library functions (for whatever standard they are trying hardest to comply with), that by default they should be not be prototyped in any of the standard library function headers and by default they should not be linked into ordinary user code.

私の感触ではCコンパイラ・ベンダーが、標準的なCライブラリ関数(それらがらが懸命に遵守しようとしているどんな標準のためにでも)を越えてライブラリ関数を供給するなら、デフォルトによって、標準的なライブラリ関数のヘッダのどんなものでもプロトタイプを作成できないということです、そして、デフォルトでは、それらは通常のユーザコードにリンクされてはなりません。

I don't know about mingw, but for gcc/cygwin version 3.4.something there is a prototype in <stdio.h> that is surrounded by a conditional #indef __STRICT_ANSI...#endif. So one way to suppress the warning would be to use a command line with the -ansi switch. For gcc 4.something on my Linux systems, there is also a prototype for index in <stdio.h>. It's a little harder to understand what specific conditions are required to use or not use that prototype, but the -ansi switch will suppress the message again. (And with this switch, it will not try to link the built-in index function.) Or you could use either -std=c89 or -std=c99 to get it to compile and link OK.

MinGW については知りませんが、gcc/cygwin 3.4.x では、stdio.h のプロトタイプは、#indef __STRICT_ANSI...#endif で囲われています。警告を抑えるひとつの手段が、コマンドラインで、−ansi スイッチを使うことです。私の Linux 環境の gcc 4.x では、index のプロトタイプも存在します。

プロトタイプが使われるかどうかに、どのような特定の条件が必要とされるかを理解するのは少し複雑ですが、この -ansi スイッチでメッセージを抑えられます。(それから、このスイッチによって、組込み関数にリンクしようとはしなくなります)ほかには、コンパイルとリンクを問題なく行わせるため、-std=c89 か -std=c99 を使うことができます。


index 関数は、OS依存の関数のようだ。
HP社の OpenVMS の C ランタイム・ライブラリ・リファレンス・マニュアル には、 index 関数が載っている。これによると、 index 関数は、ANSI-C標準ライブラリ関数 strchr と同等だということがわかる。
以下のページも、index 関数に触れている。

GNUコーディング・スタンダード
Cの一番良い使い方
5.7 システム関数の呼び出し
http://www.bookshelf.jp/texi/standards/standards-ja_5.html#SEC24

シニアエンジニアの庵
標準ライブラリ関数
http://sehermitage.web.fc2.com/program/c_stdlib.html



コンパイラ・スイッチについては、こちらも参考になった。

ホワット・ア・ワンダフル・ワールド
-fno-builtin か・・・ 知らなかった
http://alohakun.blog7.fc2.com/blog-entry-428.html#

[その他] GNU Bison 日本語出力を英語出力に

 
GNU Bison を Windows の DOS窓 で使用するとき、
コマンド us で英語環境 us モードに切り替えれば、
出力ファイル(*.output)を日本語出力から英語出力にできる。