プロが教えるわが家の防犯対策術!

C言語でプログラムしてますがコンパイルすると次のようなメッセージが出ます
func.c:1984: warning: declaration of 'index' shadow a global declaration
/usr/include/string.h:1233: warning: shadowed declaration is here
このメッセージが出る原因は何で、解決策はどうすればよいでしょうか

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ANo.2 & 3です。


解決策といっても、どうしたいの?
間違いない解決策はANo.2に示してあるように、indexなんて名前の関数なり変数を使わないこと。歴史的にはBSD系の関数で標準ライブラリ関数としては傍流だけど、それなりに使われているから可読性を損ねるのは間違いない。

それでも使いたいというなら警告を無視すれば良い。所詮は警告だし、レガシーな関数なので隠されても特に問題はないでしょう。警告が出ていると拙いというなら#pragmaか何かで明示的に抑制すれば良い。

あと、string.hはインクルードしているけどstrings.hはインクルードしていないという件は・・・標準ライブラリって仕様外の関数・変数を宣言しないって仕様になっていましたっけ? なっていればライブラリのバグですが、string.hでstrings.hを読み込んでるとかじゃないかと思いますけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
その後調査し自力で解決できました

頂いた回答は解決につながりませんでしたが、しかし時間を割いていただきありがとうございました

お礼日時:2016/12/06 20:54

Linuxのコマンドラインか、インターネットの検索エンジンで「man index」とすれば情報が得られるかと思います。

indexはレガシーで現在の標準ライブラリ仕様からは削除されていますが、もともとstrings.hで宣言される文字検索関数です。それでほとんどの処理系では互換性のために今でもindexの実装が残っていると思われます。

Man page of index によると
>4.3BSD; POSIX.1-2001 では「過去の名残 (LEGACY)」と位置付けられている。 POSIX.1-2008 では index() と rindex() の仕様が削除されている。 代わりに、 strchr(3) と strrchr(3) の使用が推奨されている。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

man index というのは、例えば次のようなページでしょうか
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/ …
このページであれば質問前に参照しており、そこで解決しなかったため質問しました
このページによればstrings.hをincludeすればindexを使用できるようですが質問に記載したメッセージの通りstrings.hではなくstring.hでindexが定義されているようなメッセージでした
実際にプログラムのほうもstring.hはincludeしていますがstrings.hはincludeしていません
質問に記載のメッセージが出る原因は何でしょうか、どうやったら解決できますか

お礼日時:2016/12/04 23:18

日本語訳してみましょう。


< func.c:1984: 警告: 'index'の宣言は大域宣言を隠す。
< /usr/include/string.h:1233: 警告: 隠された宣言はここ。
このくらいの英語は読めないと・・・

func.cの1984行目で'index'を宣言しているが、string.hにindexという関数があり、それが同名のために隠されてしまうので警告された。
func.cの中でstring.hのindex関数を使っていない限り動作には問題ないが、標準ライブラリの関数と同名の関数(変数?)を使うのは可読性が下がるのでやめましょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます

より詳しいことはNo.1の回答へのお礼に記載しましたので、そちらを参照してください

追加の質問がありますが

> func.cの中でstring.hのindex関数を使っていない限り動作には問題ないが、標準ライブラリの関数と同名の関数(変数?)を使うのは可読性が下がるのでやめましょう。

ここで述べられている標準ライブラリというのはどういうものでしょうか

お礼日時:2016/12/01 21:41

そのメッセージの意味は理解できていますか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます

すいません、このメッセージの登場にあまりに衝撃を受けて質問を少し端折っていたようです
作成中のプログラムに置いてstring.hをincludeしていましたが、なぜか「index」という名称が定義済みになっていました
indexについて以下のサイトで確認しましたが

※ http:を付けると正常にリンクが生成されないので外しました。
//www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010

C言語の予約語や、ライブラリの関数名や変数名などに見つけることができませんでした
それにもかかわらず定義済みとなっている原因は何でしょうか、そしてこれはどうやったら解決できるのでしょうか
コンパイラのバージョンを上げれば解決するのでしょうか

お礼日時:2016/12/01 21:40

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qunsigned long long 型のフォーマット指定子

unsigned long long 型の変数の値を表示したいのですが、
フォーマット指定子は%ldですか?
よろしくおねがいします。

Aベストアンサー

規格上は、%llu のように ll を付けます。(unsigned long longなので、%lld ではなく %llu です。)
ただし、C99に準拠した処理系ではなく、単に独自拡張としてlong long型をサポートしている場合には、%Lu とか %qu とかになる場合もあります。場合によっては、long long型が存在する処理系でも、printf系関数で正しく書式化する方法が存在しないこともあり得ます。

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。


人気Q&Aランキング