That a header only contains "defines, typedefs and structs" is not important, the content of the file is covered by the terms of the GPL license. Headers are a part of the source code and can contain compilable code, such as inline functions, full C++ class/template definitions, a define can also be composed of defines from other headers which may add code and can be easily overlooked.
I think the distinction here is that reading an installed header file during compilation is not the same as copying the header into your project. If you copied the header file into your project you would then still have to adhere to the GPL terms.
As noted by Bart "accessing Linux kernel system calls" is not considered a derivative work. This is specific to the Linux kernel, other projects may not have this exemption, which is why the LGPL was created which specifically adds that "an Application may incorporate material from a header file that is part of the Library" so that headers may be used without enforcing the GPL terms onto the end project.