我有一個散佈在我的代碼中的函數。它用於開發,但我不希望它在最終系統中運行。這樣做的一個方法是使用宏:C++如何選擇性替換空函數中的函數
#if SPEAK_ENABLED
#define speak(m) implementation(m)
#else
#define speak(m) ((void)0)
#endif
這個效果很好,但我不知道是否有任何其他機構(可能使用模板),我可以用它來獲得一個相似的行爲。
我試過的一件事是聲明一個函數,然後在所有主要的.cpp文件中提供一個實現。例如:
enable.h:
void speak()
{
std::cout << "Output enabled" << std::endl;
}
disable.h:
void speak()
{
}
silent_main.h:
#include "disable.h"
int main(int argc, char *argv[])
{
speak();
return 0;
}
talking_main.h:
#include "enable.h"
int main(int argc, char *argv[])
{
speak();
return 0;
}
這適用於上述簡單情況,但它不適用於我的庫,因爲它們會在鏈接時缺少函數的定義。
這基本上是我的用例。我想爲一個可執行目標禁用此功能,但爲所有其他目標啓用此功能。
這僅僅是其中使用宏是合理的情況之一嗎?
您的宏示例實際上是錯誤的 - 在#if分支中,您不應該用分號終止擴展命令,在#else分支中您應該擴展爲無操作((void)0 )'而不是 – UnholySheep
感謝您的信息。這就說得通了。我迅速從其他地方複製它。我將編輯修復它。 – user2445507