2009-12-18 72 views

回答

15

我发现,一个好办法算出这个国王的问题,就是,至少与海湾合作委员会,有这个Makefile:

defs: 
    g++ -E -dM - < /dev/null 

那么,:

$ make defs 
应该

输出的所有你有可用的定义。

所以:

$ make defs | grep -i AIX 
$ make defs | grep -i HP 

应该给你答案。对于Linux示例:

$ make defs | grep -i LINUX 
#define __linux 1 
#define __linux__ 1 
#define __gnu_linux__ 1 
#define linux 1 

一旦你找到了定义你所寻找的,你在你的代码的开头键入:

#if !(defined(HP_DEFINE) || defined(AIX_DEFINE) || defined(SOLARIS_DEFINE)) 
# error This file cannot be compiled for your plateform 
#endif 
+0

这是我一直在寻找:)谢谢 – Vijay 2009-12-18 17:00:17

+1

整洁----------答案 – KeatsPeeks 2009-12-18 17:18:31

+1

非常酷 - 尼斯今天新学的东西。应该指出的是,并非所有目标系统(即嵌入式系统)都具有用于gcc的自定义预定义宏。特别是如果你只是使用通用的CPU特定的gcc版本(以处理器而不是系统为目标)来生成代码。在这种情况下,您需要使用-D选项创建自己的预定义宏。 – Adisak 2009-12-18 17:28:07

4

宏如何传递给编译器?

i.e. gcc -Dmacro[=defn]

然后测试您的代码中宏与#if简单#ifdef(如果你给它的值)。您的目标平台可能已经有预定义的宏。


[编辑:把一些在这里我的答案我的意见解释-D工作原理]

-Dmacro[=defn]编译器在命令行上是相同的代码有#define macro defn。您将其展开为:-Dfoo=bar相当于#define foo bar。此外,该定义是可选的,所以-Dfoo相当于#define foo

+0

请你了解这个'-D' – Vijay 2009-12-18 16:48:07

+0

'-Dmacro [= DEFN]'编译器在命令行上解释是相同的代码具有'的#define宏defn'。 – Adisak 2009-12-18 16:49:17

+0

你把它展开为btw ...就像这样:'-Dfoo = bar'等价于'#define foo bar'。 – Adisak 2009-12-18 17:00:29

3

要小心你如何处理这个问题。您应该根据功能(而不是O/S)确定要使用的操作系统的功能,并相应地编写代码。然后,在一个标题中,您可以确定要编译的操作系统上有哪些功能可用。这是autoconf使用的技术,即使你不使用autoconf本身,它支持的技术也比基于平台的技术更好。请记住,在一个操作系统上发现的功能通常会迁移并在其他操作系统上使用,因此,如果您按功能工作,则与仅完成操作系统相比,您可以更轻松地适应未来。

您还必须适当编写代码,并且可移植。尽可能将独立文件中的操作系统依赖关系隔离起来,并编写一个抽象的操作系统接口来执行您所需的操作。极端的情况下,你最终得到一个Java JVM;你不需要走得太远,但你可以避免大部分的问题。

查看便携式库,如Apache便携式运行时(APR)库。

而写的线沿线的代码:

#ifdef HAVE_PWRITE 
...code using pread() and pwrite()... 
#else 
...code using plain old read() and write()... 
#endif 

这是一个严重过度简化的例子 - 有可能是一个数回退的,你使用纯阅读前()和write()。不过,这是最便携的代码中使用的概念 - 例如GCC和Apache等。