Creo que POSIX define una función para ello, pero
únicamente te serviría para sistemas POSIX o cercanos a él (UNIX, GNU/Linux, AIX, QNX, MacOS, BeOS...).
Una alternativa que sí tienen todos los compiladores de C/C++ son las directivas de identificación. Por ejemplo:
Código:
char* NombreSO (void)
{
#ifdef DOS
return "DOS"
#endif
#ifdef OS2
return "OS/2 (o eCom Station)";
#endif
#ifdef WIN16
return "DOS + Windows 3.x";
#endif
#ifdef WIN32
#ifdef WINXP
return "Windows XP";
#endif
#ifdef WINNT
return "Windows NT";
#endif
return "Windows 95/98";
#endif
#if defined(COCOA) || defined(DARWIN)
return "MacOS X";
#endif
#ifdef BSD
#ifdef FREE_BSD
return "freeBSD";
#endif
return "BSD";
#endif
#ifdef LINUX
return "GNU/Linux";
#endif
}
Bueno, más o menos porque los nombres de las macros las he puesto de memoria y no sé si son los correctos. En los manuales de los compiladores incluyen una lista de las directivas definidas.