tags:

views:

1222

answers:

4

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.

+1  A: 

You 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.

hobbs
thanks. I don't have autoconf available, so I guess I have to go with compiler version macro checks...
vividos
Alex's answer, not this one, is the correct answer. `errno_t` should never be used for anything because the type of `errno` is specified as `int`.
R..
A: 

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.

fbonnet
+2  A: 

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.

alex tingle
"all names that end with `_t` are reserved." Is that so? Where is this declared?
sbi
sbi: Hmm, I didn't have a ready answer, so I've done a bit of research. The _t namespace is widely described as being "reserved by POSIX", but I've not found anything to that effect in the POSIX spec. The best source is from glibc: http://www.gnu.org/s/libc/manual/html_node/Reserved-Names.html. I think it boils down to the fact that POSIX, or ISO C may define new _t names, so in many people's opinion they are best avoided in application code.
alex tingle
C99 enumerates the types defined in the standard headers and warns that "typedef names beginning with `int` or `uint` and ending with `_t` may be added" to `stdint.h` but it doesn't embargo `*_t` entirely.
hobbs
A: 

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
Jeff Ober