2009-08-27 17 views
2

私はGNU core utilsのコードを使って作業していますが、void usage()関数は属性 "noreturn"で明示的に設定されています。さて、私は関数を変更しています。戻りたい(exit()への呼び出しを削除しました)。コンパイラはまだ "noreturn"関数が返ってくると不平を言って、Eclipse CDTデバッガを使用するときは、コードを実行するのは変則的です - 私はコードの行をスキップします。関数が.cファイルに設定されていないと、この.cファイルの.hファイルがありません。gccで関数の属性が設定されている(設定解除する方法)

ファイルはdf.cです。私はファイルdf_call.cの名前を変更しました。コンパイラはどのようにこの属性を見つけることができますか?どうすれば解除できますか?

ありがとうございました。

======= すべての貢献者のおかげで助けになりました! GNUutils 7.4で見つかったusage()関数は、system.hでプロトタイプ化されています( )。void usage(int status)ATTRIBUTE_NORETURN 'void use(int status);/ATTRIBUTE_NORETURN; /'が解決されました。私にとっての問題が、変更system.hの問題を残し

長い答えは:GNU Cコンパイラは、関数 に属性を割り当てるサポート(http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.htmlを参照してください) 「noreturn」である1構文。 "属性((noreturn))" (http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntaxを参照) ですが、ATTRIBUTE_NORETURNにはマクロであることがよくあります。属性が設定されている場合、この場合は1つ は関数から復帰しようとしますが、実行可能ファイルはcomplaintでコンパイルされますが、 がコンパイルされ実行されます。しかし、予期しない動作をします(私の場合 のsrc行をスキップします。おそらく最適化のためです)。 Eclipse CDTのデバッガは実際には 行のコードを飛び越え、開発者は自分の感覚を疑うようになります。

+0

__noreturn__(またはATTRIBUTE_NORETURN、私はGoogle Codeearchで見つけることができるcoreutilsのバージョンでtypedefされている)のためのソースを覗いてみましたか? –

+0

Er、それは '__noreturn__'、すごいマークダウンでなければなりません。 –

+0

そのディレクトリの 'usage'に" grep "を実行することをお勧めします:) –

答えて

1

ソースファイルの前処理をお勧めしますので、翻訳単位の内容全体を利用できます。そこから、usageを検索して、gcc属性がどこから来ているのかを確認します。また、関数宣言に影響する可能性のあるgccコマンドライン引数やマクロをチェックする必要があります。

+0

私はgccに直接電話していますので、コンパイル行のdefを実行していないので、実際には最小限の引数を使用しています。 – cvsdave

0

の代わりにgcc -Eを実行し、結果を確認してください。運があれば、そこにはnoreturn属性が来ていることが明らかになります。

また、gcc固有の拡張機能を使用しないようにすることもできます。

が動物を飼いならすかもしれません。

関連する問題