2016-11-20 5 views
0

通常呼び出すことができない関数の参照を渡すのが安全である(そしてなぜ)のだろうかと思います。私が持っているファイルmyFunct.cppで言い換えるプライベート関数の参照を外部関数に渡す理由は何ですか?

このような何か:externalStuffインサイド

#include "externalStuff.h" 
#include "myFunct.h" // myFunct_publicFunction proto 


static void myFunct_foo(void); 
static void myFunct_foo(void) 
{ 
    [...] 
} 


void myFunct_publicFunction() 
{ 
    externalStuffObj.init(myFunct_foo); 
} 

参照は、このように関連付けられている:

externalStuffClass::init(void (*function)(void)) 
{ 
    externalStuffReference = function; 
} 

このコードスニペットは、実際にコンパイルし、 externalStuffObjが何らかの理由でmyFunct_fooの格納された参照を呼び出すと、正しく実行されます。 私は、ソースファイル内で静的関数を宣言することは、C言語ではprivate関数を持つことと同等であると考えており、そのようなソースファイルに含まれていない関数では使用できません。

私の質問は、これが安全であるか、それが幸運な要因のために働いていて、ポインタを混乱させる可能性があるということです。

答えて

0

staticとして関数を宣言すると、その連結に影響します[basic.link/3]。この場合、内部リンケージ(第2の欄here参照)のみがあり、リンカーは別の翻訳単位からその機能を見ることができません。ただし、そのような機能のアドレスを取得して別のモジュールに渡すことはできません。

それはプライベートメンバーをリークとほぼ同様です:

class MyClass{ 
    MyObject obj; 
public: 
    MyObject* get(){ return &obj; } 
}; 

それを行うための法的および正当な理由があるかもしれません。それでも、その機会は虐待される可能性があります。

1

これは安全です。プライベート関数でも同じことができます。 privatestaticは、関数自体ではなく名前へのアクセスのみを制限します。

関連する問題