#if
defined(_AIX)
//
IBM
AIX
...
...
#endif
#if
defined(__sun)
//
SUN
OS
...
...
#endif
linux下定义了
"linux",
Sco
Openserver下定义了unix
上面的方法有时候不是很确定,也不好自己掌握和控制,下面探讨一下另一个方法:
在UNIX下有一个uname的命令,在不同的操作系统下有不同的返回,
例如:
SCO:
SCO_SV
Linux:
Linux
AIX:
AIX
Unixware:
UnixWare
可以在makefile文件中增加如下句子来判断当前的操作系统类型,和编译选择:
OSTYPE=`uname`
CFLAGS_SCO
=
-D
SCO_SV
CFLAGS_LINUX
=
-D
AIX
prog:
@if
[
"$(OSTYPE)"
=
'SCO_SV'
]then
make
prog1else
make
prog2fi
prog1:
$(CC)
-o
tt
tt.c
$(CFLAGS_SCO)
prog2:
$(CC)
-o
tt2
tt2.c
$(CFLAGS_AIX)
如上在编译命令行中增加-D
SCO_SV的定义,
程序的源代码中可以如下使用:
#ifdef
SCO_SV
typedef
unsigned
int
socklen_t
#endif
如此,源代码就很容易的适应不同的操作系统了。
redhat系统可直接从文件中读取:cat /etc/redhat-releasewindows:GetUserName(LPWSTR lpBuffer, LPDWORD nSize)lpBuffer是一个数组的地址,用来存贮得到的用户名,nsize是个指针,指向此存贮此数组大小的单元,就是数组能存贮的字符数量GetVersionExW(LPOSVERSIONINFOW)参数LPOSVERSIONINFO是一个指向OSVERSIONINFO类型变量的指针,具体判断代码如下定义 OSVERSIONINFO osvi然后调用函数取得版本号,判断如下switch (osvi.dwPlatformId){case VER_PLATFORM_WIN32_NT:if (osvi.dwMajorVersion == 5&&osvi.dwMinorVersion == 0){strOSVersion = TEXT("Windows 2000") }else if (osvi.dwMajorVersion == 5&&osvi.dwMinorVersion == 1){strOSVersion = TEXT("Windows XP") }else if(osvi.dwMajorVersion == 6&&osvi.dwMinorVersion == 0){ strOSVersion = TEXT("Windows Vista") }else if (osvi.dwMajorVersion == 4&&osvi.dwMinorVersion == 0){strOSVersion = TEXT("Windows NT") }break case VER_PLATFORM_WIN32_WINDOWS:if (osvi.dwMajorVersion == 4&&osvi.dwMinorVersion == 10){strOSVersion = TEXT("Windows 98") }else if (osvi.dwMajorVersion == 4&&osvi.dwMinorVersion == 90){strOSVersion = TEXT("Windows ME") }else{strOSVersion = TEXT("Windows 95") }break default:break}