我正在開發一個 C 庫,有兩個函式:func1和func2.
如果開發人員在呼叫func1之前忘記呼叫,我想生成一個編譯時錯誤func2:
這將沒問題:
func1();
func2(); // OK
但這會失敗:
func2(); // ERROR, you forget to call func1()
當然,很容易產生運行時錯誤,但我想產生一個編譯時錯誤。
我試過如下但它不起作用,因為我無法修改constexpr變數:
static constexpr bool b {false};
void func1() {
b = true; // ERROR!
}
typename<std::enable_if_t<b == true>* = nullptr>
void func2() {}
我不太擅長元編程。我想知道在這種情況下是否有可能產生編譯時錯誤。
uj5u.com熱心網友回復:
至少在極端情況下這是不可能的。查看以下代碼(scanf為簡潔起見,省略了標頭和回傳值測驗):
int main() {
int code;
printf("Enter code value: ");
scanf("%d", &code);
if (code > 0) func1();
func2(); // has func1 be called ?
return 0;
}
在這里,即使是最好的靜態分析工具也無法說明func1之前是否呼叫過,func2因為它取決于一個只有在運行時才知道的值。好吧,這是一個相當愚蠢的例子,但現實世界的程式經常在運行時讀取它們的配置資料,并且該配置甚至可以更改其初始化的一部分。
uj5u.com熱心網友回復:
明確時間耦合:
- make
func1回傳一個應該被消耗的型別func2:
struct func1_result {
// Possibly constructors private, and friendship to `func1`.
//...
};
func1_result func1();
void func2(const func1_result&);
所以你不能在沒有func2首先創建的情況下呼叫func1_result(由 回傳func1)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375293.html
下一篇:類層次結構虛擬方法的CRTP引數
