I'm developing a C library, there are two functions: func1
and func2
.
I want to generate an compile-time error if developer forgets to call func1
before calling func2
:
This will be OK:
func1();
func2(); // OK
But this would fail:
func2(); // ERROR, you forget to call func1()
Of course, it's very easy to generate a runtime error but I would like to generate a compile-time error.
I've tried as below but it's not working because I can't modify a constexpr
variable:
static constexpr bool b {false};
void func1() {
b = true; // ERROR!
}
typename<std::enable_if_t<b == true>* = nullptr>
void func2() {}
I'm not very good at metaprogramming. I want to know if it's possible to generate a compile-time error in this case.
CodePudding user response:
It is not possible at least in corner cases. Look at the following code (headers and test for scanf
return value omitted for brievety):
int main() {
int code;
printf("Enter code value: ");
scanf("%d", &code);
if (code > 0) func1();
func2(); // has func1 be called ?
return 0;
}
Here, even the best static analysis tool will be unable to state whether func1
is called before func2
because it depends on a value which will only be known at runtime. Ok, this is a rather stupid example, but real world programs often read their config data at run time and that config can change even part of their initialization.
CodePudding user response:
Make temporal coupling explicit:
- make
func1
return a type which should be consumed byfunc2
:
struct func1_result {
// Possibly constructors private, and friendship to `func1`.
//...
};
func1_result func1();
void func2(const func1_result&);
So you cannot call func2
without creating first func1_result
(returned by func1
).