5 ms·
I use this pattern across my codebase for the "critical functionality missing" scenario: #if DEBUG #define TODO(msg) #else #define TODO(msg) #error msg
by john_moscow 7y ago
I use this pattern across my codebase for the "critical functionality missing" scenario:
#if DEBUG
#define TODO(msg)
#else
#define TODO(msg) #error msg
#endif
Works like a charm. I've got another PRERELEASE() macro that lets you do an unofficial preview build, but would break an official stable release.
- Toury2d 7y agoThat doesn't sound like it would scale at all for any more than a couple of devs.
- john_moscow 7y agoNeither do TODO comments. This is just for a short-term "don't forget this piece before calling the current job done". For anything more long-term you want to use a proper task management system with priorities, deadlines, dependencies and so on.
- earenndil 7y agoSlight tweak: #if DEBUG #define TODO(msg) #warning msg #else #define TODO(msg) #error msg #endif
- darkkindness 7y agoNice! Isn't this exactly assert in C++? (the following is from https://en.cppreference.com/w/cpp/error/assert https://en.cppreference.com/w/cpp/error/assert) #ifdef NDEBUG #define assert(condition) ((void)0) #else #define assert(condition) /*implementation defined*/ #endif ... assert(("There are five lights", 2 + 2 == 5)); ... test: test.cc:10: int main(): Assertion `((void)"There are five lights", 2+2==5)' failed. Take it as a token that you are doing something right. :)
- john_moscow 7y agoAssert's run-time. This is compile-time (i.e. all instances are guaranteed to trigger during build). C++ equivalent would be a static_assert, but it has a totally different use case like this: static_assert(sizeof(StructUsedInSomeBinaryProtocol) == SomeConstantExpectedByTheOtherSide, "<...>")
- TeMPOraL 7y agoWe used to do static asserts with a preprocessor macro that typedefed an array with size expressed as: (your condition) ? 1 : -1. Point being, static asserts have the use case you want them to have; I see no reason to not have a TODO macro that expands to static_assert(false, "...").
- hvdijk 7y agoMacros cannot expand to preprocessing directives. This does not result in a #error-directive, this just results in a syntax error because of an unexpected # token. A better definition would be something that highlights that message in the error output, such as static_assert(0, msg).