最簡單的解決辦法是:
std::string DataDirHelper(const std::string& file) {
#ifndef CRYPTOPP_DATA_DIR
return file;
#else
std::string dataDir("" CRYPTOPP_DATA_DIR);
...
#endif
}
CRYPTOPP_DATA_DIR
時是一個字符串,編譯器將與相鄰的空字符串合併。當它不是一個字符串文字時,如果這個宏足夠糟糕,它仍然可以編譯(帶有一些前導逗號以及什麼不是)。
或者,我們可以使用static_assert
需要字符串文字作爲參數的要求。因此,我們可以寫這樣的代碼:
std::string DataDirHelper(const std::string& file) {
static_assert(true, CRYPTOPP_DATA_DIR);
std::string dataDir("" CRYPTOPP_DATA_DIR);
...
}
如果CRYPTOPP_DATA_DIR
不是字符串文字,你會看到這樣的錯誤消息:
foo.cc:12:9: error: expected string literal
static_assert(true, CRYPTOPP_DATA_DIR);
^~~~~~~~~~~~~~~~~
難道你不只是得到一個編譯錯誤,如果它是一個詮釋? –
這似乎是一個奇怪的事情來測試,就像試圖在for循環體內斷言你沒有意外地聲明'i'是一個字符串。你爲什麼需要這樣做? – user2357112
@ user2357112 - 問題是用戶定義了'CRYPTOPP_DATA_DIR',而不是庫。只要允許用戶做出選擇,我們就必須爲意想不到的事情做好計劃。主知道他們可能會想出什麼...... – jww