I'm compiling code using gcc that comes from Visual C++ 2008. The code is using errno_t, but in some versions of gcc headers including <errno.h>
doesn't define the type. How do I detect if the type is defined? Is there a define that signals that the type was defined? In the case it isn't defined I'd like to provide the typedef to let the code compile correctly on all platforms.
views:
1222answers:
4You can't check for a typedef the way you can for a macro, so this is a bit on the tricky side. If you're using autoconf
, this patch shows the minimum changes that you need to have autoconf check for the presence of errno_t
and define it if it's missing (the typedef would be placed in a file that includes your generated config.h
and is included by all files that need errno_t
). If you're not using autoconf
you need to come up with some way to do the same thing within your build system, or a very clever set of tests against compiler version macros.
This is typically the case where GNU autoconf comes to the rescue. Basically autoconf will generate a configure script that can detect various system-dependent features such as whether this type exists and how it is defined. You then include the generated C header file within your application.
Microsoft's errno_t
is redundant. errno
is defined by the ISO C standard to be a modifiable lvalue of type int
. If your code needs to store errno
values, then you should put them into an int
.
Do a global search and replace s/errno_t/int/
and you're done.
Edit: Also, you shouldn't be providing a typedef int errno_t
in your code, because all names that end with _t
are reserved.
If you know which versions of GCC are giving you trouble, you can test for them. You can check for versions of GCC using something like:
#if __GNUC__ == 3
...
#else
...
#endif