Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有在编译时标识SunOS/Solaris版本的头文件?_C++_C_Solaris - Fatal编程技术网

C++ 是否有在编译时标识SunOS/Solaris版本的头文件?

C++ 是否有在编译时标识SunOS/Solaris版本的头文件?,c++,c,solaris,C++,C,Solaris,我试图在编译时检测Solaris/SunOS版本,以便启用/禁用和其他API的使用 编译时是否有标识SunOS/Solaris版本的头?如果没有头提供此信息,您当然可以解析uname的输出,并从构建脚本/makefile/…生成-D预处理器选项来扩展@meansion matters answer,使用GNU make,和操作系统版本。使用-D命令行选项将该变量传递给编译器 生成文件: OS_VERSION := $(shell uname -r) version: $(CC) -DOS

我试图在编译时检测Solaris/SunOS版本,以便启用/禁用和其他API的使用


编译时是否有标识SunOS/Solaris版本的头?

如果没有头提供此信息,您当然可以解析
uname
的输出,并从构建脚本/makefile/…生成
-D
预处理器选项来扩展@meansion matters answer,使用GNU make,和操作系统版本。使用
-D
命令行选项将该变量传递给编译器

生成文件:

OS_VERSION := $(shell uname -r)
version:
    $(CC) -DOS_VERSION=$(OS_VERSION) version.c -o version
test:
    echo $(OS_VERSION)
c版:

#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
int main()
{
    printf( "OS Version: " TOSTRING(OS_VERSION) "\n" );
    return( 0 );
}
使用
:=
(如果尚未设置,则分配)仅运行
uname
命令一次


这将显示Solaris 10的“5.10”,Solaris 11的“5.11”。

详细说明@的建议,可以使用
uname-r
的输出创建编译时定义,例如
SUN\u VERSION
。这实际上给出了一个浮点数,例如,
5.10
,您可以使用一个简单的sed命令将其转换为预处理器的类似形式,例如,此编译器选项:

-DSUN_VERSION=`uname -r | sed -e 's/\.\([0-9]\{1,1\}\)$/0\1/' -e 's/\.//'`
5.10
生成
510
,为
5.9
生成
509
,等等

在源程序中,您可以这样使用它

#if SUN_VERSION >= 510

(或任何有意义的东西)。

识别操作系统版本以断言
API是否可用,如果不是注定要失败的话,这是有风险的。您不能假设
API
将保留在将来的版本中,也不能假设它在并行分支中可用(例如,Illumos与Solaris 11,两者都将
SunOS 5.11
作为其版本报告)


克服这个问题的通常方法是通过编译一个小的测试源代码来检查
API
是否可用。这通常在传统上命名为
configure
的脚本中完成,该脚本构建了一个
Makefile
和一个为您的系统定制的include文件

您不需要gnumake来完成这个过程(它可以通过makefile中的普通shell命令来实现)。@ThomasDickey我确信这一点。把你的解决方案也贴出来作为答案。但我已经习惯于使用GNU make——即使在Solaris上也是如此——以至于我现在一直默认使用它。即使在Solaris上,GNU扩展也已变得司空见惯。我非常确定,甚至OpenSolaris的某些部分(在Oracle关闭之前)都必须使用GNU make构建。我希望你没有因此而投我一票……这就是我的意思;非常好
#if SUN_VERSION >= 510