C静的関数内での言語の理解

  最初の二つのブログを見てみましょう:個々のヘッダファイルを理解し宣言と定義を理解します 

  他のCPPに見られる静的関数CPPの定義でのみ静的関数は表示されません。

  例えば、私はプロジェクトを作成し、プロジェクトは三つのファイル、ヘッダファイル、および2つのCPPファイルを持っています。次のようにドキュメントを読み取ります。

  ビルドプロジェクト間移動の間違ったが、エラーメッセージが楽しいです()関数が定義されていないと宣言されます。

  なぜコンパイラが楽しみを見つけることができません()関数は、それを定義しているのでしょうか?私ははっきりとそのように楽しい()関数内でSource.cppで定義されました。

  理由は簡単です:静的関数の範囲が非常に小さくこれだけではcppのに効果的でなく、プロジェクト全体で有効。だから、main.cppにで楽しい()関数の定義を見つけることができません。

  この特徴によれば、我々は次のような、いくつかの一見どこにも操作を行うことができます。

 

  ねえ、実際に理由である、成功した構築?私ははっきりと明確に定義され、ここで、各関数は最大で一度だけ定義することができますと言っていた「二回を。」

  のは、最終出力の結果何を見てみましょうか?これは、「こんにちは」や「世界」とは?

 

  楽しい()関数で使用する答え「世界」である、すなわち、main()関数は楽しいmain.cppに()関数の定義に使用されています。

  ただ、本CPPの範囲でのみ静的関数ので、締結、したがってmain.cppに楽しいSource.cpp()関数の範囲、および競合は存在しません。:私たちは、ほとんどの機能は、実際には、完全なステートメントがあるべき、一度だけ定義することができます前に言った同じスコープ、関数が最も一度に定義されています。真実のよう:同じ葉二つの世界が存在していませんが、別のパラレルワールドでは、同じと私たちの世界の葉があるかもしれません。(の根本的な原因は、まだリンクのこの部分についてCSAppという見ているかどうかを確認するには)。

  main.cppには楽しみのように定義()関数は、自然(main.cppを楽しみに発見された)ので、「世界」のための最終的な出力を通じ説明することができ、むしろ定義Source.cpp楽しみ()関数よりも、定義されていますA。

 

  二つの例は、以下に説明されています

  まず、ヘッダファイル書き込みの静的関数の完全な定義は何が起こるのだろうか?各結果は、関数定義を使用することができ、CPPを含むヘッダファイルです。

 

  第二に、ヘッダファイルに記述された非スタティック関数の完全な定義はどうなりますか?結果は:ヘッダファイルは、ファイルのCPPを複数含む場合、関数によるリンクは、定義され、失敗を繰り返した場合。

 

だから、静的な本当の使い方機能は何ですか?

    私たちは、ヘッダファイルの役割についてお話しましょう:ヘッダファイルの役割は、実際にインタフェース(関数)を宣言し、それはヘッダファイルのCPP(ユーザー)ヘッダファイルは、インターフェース(機能)内で宣言呼び出すことができますが含まれています。

    上述したように、静的な関数は、有効な機能のCPPの定義で定義されました。二つの例は、以下に説明されています。

  第一种情况:某 static fun()函数在a.h中被声明,然后a.cpp包含了a.h并对static fun()函数作出了定义。此时有一个b.cpp出现了,它也包含了a.h,然后它就看到了fun()函数,它以为fun()函数是别人已经写好的接口,然后它就调用fun()函数,结果会如何?link失败,情况与上面的例子相同。因此static函数的声明不应该放在头文件中。

  第二种情况:将static函数的定义放在头文件中,build会出问题么?不会,但是有必要这么做么?没必要。这样做的效果是让每个包含该头文件的cpp文件都能够使用该接口(函数),既然目的是让每个cpp文件都能够使用该接口,就没必要将该函数设置为static函数了。将其设置为非static函数,在某个头文件中声明,然后随便在某个cpp文件中定义不是更好么?如果将static函数定义在头文件中,会增加compile的工作量,因为每个包含该头文件的cpp文件都需要对该函数进行编译。因此static的定义不应该放在头文件中。

  那么只剩下一种选择:static函数的声明和定义都放在cpp文件中。

使用static函数的正确姿势:

  其实static函数的真正作用在于数据隐藏(类似与c++类中的private属性),因为它只在定义它的cpp文件中是可见的嘛。

  比如说有这么一种情况,库的制作者向用户提供了两个接口interface1()和interface2(),这两个函数都调用了interfaceBase()这个函数,但是制作者并不想将interfaceBase()展示给用户(可能是怕用户用interfaceBase()函数搞破坏吧),同时interfaceBase()这个函数又只在定义这两个函数的cpp文件中使用。那么应该怎样做呢?

  首先肯定应该将interface1()和interface2()的声明放在某头文件中,为了提供接口嘛,然后在定义这两个个接口的cpp文件中定义一个static属性的interfaceBase()函数。最终如图所示:

 

  但是我将一个非static函数的声明和定义都放在cpp文件中也能够达到隐藏接口的目的呀,那么使用static函数有什么优势呢?

  这又得从作用域说起了,普通函数的作用域是整个project,而static函数的作用域仅限于本cpp。如果你在两个cpp文件中都定义了fun()函数,那么肯定会产生link错误。但是你如果在两个cpp文件中定义的是static fun()函数,那么就能避免link错误。

  因此使用static函数可以使函数重名。

  综上:如果某个函数只在某个cpp中使用,并且不希望将这个函数暴露给外界,那么就应该将它定义为static函数,定义在cpp中。

 

おすすめ

転載: www.cnblogs.com/XiaoXiaoShuai-/p/12008646.html