Coding when you are using an OS or library that requires a series of calls that build on each other to get the final result requires a set of checks to make sure each stage is successful. If some of the stages also require it partner call to free/close/destroy the items, then the programming logic requires you to be careful in how you tear down the items if there is an error in the middle of the process.
This can be coded several ways, and this post discusses a series of approaches in C++. The code selected for the example is performing Windows OS calls. These are done at the lowest API level without any other library or framework. The code has three places where tear down is required. The flow is complex enough to stop a simple reorganisation of the code to perform the same task. There is no addition error management present so make it easier to read. It is a fully working program and it gets a list of USB devices that the program is allowed access to.
Continue reading “Never Nester, Goto, RAII, and Defer”
Using the logic that we should use tools that are as simple as possible and only adopt complexity where it is absolutely necessary, it feels like I could use a very early version of C++. What follows are the reasons why I have increased that to C++17. The idea will be to only use these feature and no more. Any new use will be add to this page.
#if !((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
#error Requires C++17 or higher
Continue reading “Reasons for Using C++ 17”
The following is not intended to generate a holy war, but merely a place for me to remind myself of the decisions I took along the way to get to a consistent style for any new code that I write.
#pragma warning( push, 3 )
#pragma warning( pop )
// /Wall Used. Compiler warnings turned off.
#pragma warning (disable : 5045) // Spectre code insertion warning.
static constexpr size_t _maxEntities = 1000;
_name = name;
inline float _floor(const float& a)
if (a == 0.0f) return 0.0f;
Continue reading “C++ Coding Standards”