我想使用內置的編譯器檢查來驗證自定義日志記錄框架的格式字串,以提前捕獲由于格式字串 <-> 引數不匹配而導致的奇怪的運行時崩潰。
自定義 C 日志記錄方法的引數與printf()系列相同,所以我試圖替換所有對
MyLogger::Error(
和
fprintf(stderr,
盡管不幸的是(clang)前處理器在范圍決議運算子(::)上窒息,即而不是ULog::Warn(僅ULog識別子字串:
#define MyLogger::Error( fprintf(stderr,
關于如何使這項作業的任何建議都非常感謝。
uj5u.com熱心網友回復:
您是否嘗試過可變引數模板?在這里找到。
#include <iostream>
namespace MyLogger
{
template <typename... T>
auto Error(const char * _Format, T &&... args)
{
return printf(_Format, std::forward<T>(args)...);
};
}
#define printf(...) MyLogger::Error(__VA_ARGS__)
int main()
{
MyLogger::Error("Non-Macro Print \n");
printf("Macro Print \n");
return 0;
}
uj5u.com熱心網友回復:
如果你修改MyLogger::Error為
MyLogger::Error(args){
if (0) {
fprintf(stderr,args)
}
//actual function
}
通過這種方式,您可以獲得內置警告,并且不會影響代碼的效率。(如果你想寫入標準錯誤,你顯然可以實際使用列印,但我認為如果你想要你已經使用了它)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/330398.html
