Failing at run time A run-time failure is worse than a build-time failure You need to install and run the binary to just fail... Failing at init time is preferred ... if you are unable to fail al build time Init time is not performance-critical *at all* If RAM/flash allows, please be verbose in your messages Sometimes you can trust your caller and avoid checks For example, gpio_set/gpio_get, after checking at init time Or you can offer the double API: __some_function() doesn't check some_function() checks arguments, and is slower Any "assert" or "panic" in a critical path is a cost Assertions can be a build-time option Or you can think about a faster way to do BUG()