A common problem is that the linker does not diagnose any violation of the definition rule (ODR). Although this is not impossible, it is a difficult problem to solve, therefore, the Standard specifically allows certain ODR violations to be undiagnosed.
I would really like the compiler and linker to have a special mode that would catch all ODR violations during the build, but I admit that this will be difficult to achieve (and will consume resources that could possibly be delivered even better using, like more conformity). In any case, ODR violations can be avoided without much effort by properly structuring our code, so we, as programmers, will cope with this lack of linker verification.
However, macros that change the functionality of the code when turned on and off dangerously flirt with ODR, and a particular problem is that _SECURE_SCL and _HAS_ITERATOR_DEBUGGING do just that. At first glance, this may not seem so bad, since you should already have control over which macros are defined throughout your build system. However, separately compiled libraries complicate matters - if you created (for example) Boost with _SECURE_SCL, by default, your project should not disable _SECURE_SCL. If you intend to disable _SECURE_SCL in your project, now you need to rebuild Boost accordingly. And depending on the particular library in question, this can be difficult (with Boost, in my opinion, this can be done, I just never understood how to do this).
He lists some possible workarounds later in the commentary, but none of them are suitable for this situation. Someone else said they could turn off these flags when compiling boost by inserting some definitions into boost / config / compiler / visualc.hpp , but for me this worked NOT . However, pasting the next VERBATIM line into tools / build / v2 / user-config.jam did the trick. Please note that spaces are important for increasing jam.