簡體   English   中英

強制執行/定義功能聲明

[英]Force implementation/definition of function declaration

假設我有一個應該在C和C ++中都可以使用的標頭。 該頭文件包含程序必須定義的一些功能,例如:

EXPORTED void * STD_API GetSymbol(CProject * p, char * s);

我如何確保這些功能實際上在某處定義? 即使項目實際上沒有編譯,它也是無效的,因為這些功能將在運行時由另一個模塊查找(將其編譯為module / dll / dylib / whatever)。

我唯一想到的就是可能在某個函數調用中的某個地方使用該定義。 但是,這需要在標頭中執行函數,眾所周知,這將導致多個定義。

在C ++中,您可能可以擺脫這種黑客:

#ifdef __cplusplus

    static inline void _impcheck()
    {
        assert(0 && "_impcheck called.");

        GetSymbol(NULL, NULL);
    }

#endif

(因為內聯修飾符如何允許多個定義)。 但是c呢?

首先,C也具有staticinline

第二,那...

  1. 記錄功能將由用戶實施?

  2. 在運行時檢查功能的可用性,並在找不到某個功能時報告錯誤/引發異常? dlsym() (我假設您使用的是dlopen() API,是嗎?)在找不到符號時將返回空指針。

  3. 如果您確實希望發生鏈接時故障,則可以嘗試使用這些函數(調用它們,或者,如果您不希望過早執行副作用,則將它們的名稱分配給volatile函數指針,等等)。

C允許使用完全相同的static inline函數。 但是編譯器可能會對其進行優化,因為觸發了您的assert ,因此后續代碼被標記為不可訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM