2016-05-25 4 views
3

別の翻訳単位(別のライブラリでも)から呼び出されることを知って、匿名の名前空間にコールバック関数を宣言することができます別の翻訳単位からのポインタを介して内部リンケージを持つ関数を呼び出す

いくつかのlib:

void register_callback(void (*cb)()) 
{ 
    .. 
    cb(); 
    .. 
} 

メインプログラム

namespace { 
int foo_cb() { ... } // internal linkage 
} 

int main() 
{ 
    register_callback(foo_cb); 
} 

答えて

7

TL; DR:はい、それはokです


から[basic.link](強調鉱山):

  • それが宣言によって導入された名前 同じオブジェクト、 参照、関数、タイプ、テンプレート、名前空間または値を示す可能性がある場合リンケージを有すると言われています別のスコープ内:

    • 名が内部結合を有する場合、それが意味するエンティティは することができ、同じ変換単位で他のスコープから名前によって呼びます。
  • [...]

  • 名前名前空間または[...]内部結合を有します。 [...]。それは

    • 関数の名前である場合、内部結合は上記包囲 名前空間として同じ結合を有する所与 されていない名前空間の範囲を有する名前。または
  • だから、基本的リンケージ名ではなく、オブジェクトのよりの財産である、などの機能がこれは無名の名前空間内で宣言された関数から名前によってを呼び出すことができないことを意味します別の翻訳単位。それをポインターで呼び出すという制限はありません。

    +2

    名前とオブジェクトの区別が良好です。 – SergeyA

    関連する問題