6

私は最近StroustrupsTheC ++プログラミング言語を読んでいて、第9章のリンケージに関するセクションで次の段落に出くわしました。

「Cおよび古いC++プログラムでは、キーワードstaticは(紛らわしいことに)「内部リンケージを使用する」という意味で使用されます。関数とクラスの内部を除いてstaticを使用しないでください。」

問題は、さらに読んで、著者がこれがなぜ悪い習慣であるかについて詳しく述べなかったことです。私はコードで静的関数を時々使用して、コンパイルユニットの外部では必要のない単純な計算を行っていますが、これが眉をひそめていることに気づかず、なぜそれが悪いのかはわかりません。誰かが私のためにこれに光を当てることができますか?

4

2 に答える 2

5

内部リンケージに眉をひそめるのではなく、static:の新しい意味との混同を避けるために、staticあまりにも多くの意味があると思います(内部リンケージでの宣言、静的ストレージ期間でのローカル変数の定義、クラスの非インスタンスメンバーのマーク付け) )、したがって、直感的でないものの1つを避けることは良いことです。

このため、C ++ 98標準は、内部リンケージを使用してものを宣言する別の方法を提供します。名前のない名前空間staticであり、 「名前空間スコープでオブジェクトを宣言する場合」は非推奨になります。

C ++ 11標準では、この非推奨が削除されたため(また、名前空間のセマンティクスも変更され、内部リンクは実際には必要ありません)、実際にはスタイルの問題になっています。

于 2012-07-02T17:20:16.590 に答える
4

C ++では、基本的に同じ機能を提供する匿名の名前空間が優先されるためです。

staticこの文脈では、二重の意味と、2つの意味がまったく反対であるという事実のために眉をひそめていると思います-aclassまたはaの内側structがグローバル状態を表すのに対し、外側は内部リンクを提供し、変数のコピーを提供しますまたは各翻訳単位へのメソッド。

さらに、static関数と変数にのみ適用できますが、匿名の名前空間内では型宣言を行うことができます。

namespace  //OK
{
    class X {};
}

static class X //syntactically correct, but does nothing
{
};

標準では、を使用しstaticてlinkeageを非推奨として指定していると見なされていることに注意してください。

于 2012-07-02T17:19:17.337 に答える