簡體   English   中英

如何使用C宏(#define)更改調用,但不更改原型

[英]How to use C macro's (#define) to alter calls but not prototypes

我們應用程序中的舊代碼包含對mallocreallocfree調用。 使用我們更新的代碼,將調用我們自己的實現,而不是標准的運行時實現。 示例如下所示,

#define malloc(s) OurMalloc(s)
#define free(p)   OurFree(p)

這對於更新的代碼和較新的C ++代碼都很好,我們只需實現全局newdelete運算符,因此C ++解決方案更加“干凈”。

問題在於,我們現在必須包括一個第三方庫,該庫具有包含類的方法,這些方法的名稱類似於mallocfree ,例如

   class ABC
   {
      public:
      ...
      void free (char *p);
   };

如果該類的free方法具有相同數量的參數,則C / C ++預處理器甚至即使在類定義中,甚至在調用沒有ABC類的方法時,都用ourFree替換所有出現的free 所以上面和下面的類定義調用:

ABC abc;
abc.free(p);

被取代,

class ABC
   {
   public:
      ...
      void OurFree (char *p);
   };

ABC abc;
abc.OurFree(p);

哪個可以編譯,但是當然不鏈接。

如果ABC::free的參數數量與標准free的參數數量不同,則編譯器仍會發出警告。 我們想避免它們。

一些替代解決方案是:

  • 在第3方開始時取消定義我們的定義,包括include文件,稍后再重新定義
  • 確保在我們自己定義的內容之前始終包含第3方包含文件

但是即使這樣,如果需要我們的代碼來調用第三方類的這些malloc或free方法,則預處理器仍會更改這些調用,除非我們編寫所有如下調用:

(abc::free)(p)

有沒有辦法告訴C / C ++預處理器來定義它?

  • 只有純C呼叫必須被替換
  • 原型不得更換
  • 類中的方法不得替換

僅定義C而不是C ++的那些替換如何:

#ifndef __cplusplus
#  define malloc(s) OurMalloc(s)
#  define free(p)   OurFree(p)
#endif

為什么不只定義自己的malloc和free函數,而不使用宏。

因此,更改:

void *OutMalloc (size_t s)

至:

void *malloc (size_t s)

就像您可以使運算符new和delete完全覆蓋一樣。

我認為,盡管我可能是錯的,但鏈接器將在查找庫之前先在目標文件中查找符號。

預處理器對范圍和語義一無所知。 答案很短-不,您不能這樣做。

但是,您可以在庫模塊中#undef free使用#undef free 另一方面,如果您從代碼中調用方法abc.free() ,這將abc.free()

暫無
暫無

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

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