开发者

Is it a good idea to wrap an #include in a namespace block?

开发者 https://www.devze.com 2023-03-19 14:48 出处:网络
I have a C header that was written to compile as both C and C++ (it only uses features from the common subset, and uses that extern \"C\" thing).

I have a C header that was written to compile as both C and C++ (it only uses features from the common subset, and uses that extern "C" thing).

Problem is, that header declares stuff in the global namespace. I'd rather avoid 开发者_运维技巧that for the usual reasons. I thought about doing this:

namespace foo {
#include <foo.h>
}

Is doing this a good idea? Do I have alternatives that don't include editing the header file?


No, it’s a bad idea. With C++ declarations, it's likely to introduce linker errors as identifiers get declared in the wrong namespace. With C declarations, it works, but it may hide clashes between identifiers in the global namespace (which you were trying to avoid, I guess) until link time; it doesn't really put the identifiers in a namespace.

A better idea would be to put your own identifiers in a namespace and avoid defining anything but main in the global one.


I did this kind of "place it in a namespace" for <windows.h> in the late 1990's.

Although not with complete support: it was on the principle of adding support for whatever next I needed when I needed it.

The key to make that work was to check which C library headers were included, and make sure to include them first. It boiled down to 4 such headers, IIRC. Microsoft's love of macros made things difficult, though.

So it can be done in practice for C headers (or C++ restricted to the C-like subset), but at cost of updating your wrapper for every new version of the wrappee, Which is impractical and/or very costly. Not to mention laborious.

In conclusion, no, it's not a good idea. :-)

Speaking from experience.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号