Both GCC and Clang ship their own stddef.h which does this (musl's stddef.h is simply ignored). But, musl also defines the macro in a number of other headers. Thus, depending on which header you include last, you'll end up with a different definition of NULL. Mostly, getting musl's definition simply degrades warning diagnostics in C++ slightly -- e.g. GCC can no longer emit this warning: warning: passing NULL to non-pointer argument 1 of 'int foo(long int)' [-Wconversion-null] If you're using Clang's modules support, it can also break compilation. In that case, the conflicting definitions may be detected as a module incompatibility. A different (potentially better) fix would be to always retrieve the definition of NULL from the compiler's stddef.h (via #define __need_NULL #include ). It may also be best to delete the musl stddef.h entirely for clarity, since it's currently ignored, anyhow. But, this seemed the more minimal fix.