アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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が見つからない時は、教えて!gooで質問しましょう!

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