[英]How to use C macro's (#define) to alter calls but not prototypes
我們應用程序中的舊代碼包含對malloc
, realloc
和free
調用。 使用我們更新的代碼,將調用我們自己的實現,而不是標准的運行時實現。 示例如下所示,
#define malloc(s) OurMalloc(s)
#define free(p) OurFree(p)
這對於更新的代碼和較新的C ++代碼都很好,我們只需實現全局new
和delete
運算符,因此C ++解決方案更加“干凈”。
問題在於,我們現在必須包括一個第三方庫,該庫具有包含類的方法,這些方法的名稱類似於malloc
和free
,例如
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的參數數量不同,則編譯器仍會發出警告。 我們想避免它們。
一些替代解決方案是:
但是即使這樣,如果需要我們的代碼來調用第三方類的這些malloc或free方法,則預處理器仍會更改這些調用,除非我們編寫所有如下調用:
(abc::free)(p)
有沒有辦法告訴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.