【发布时间】:2016-02-26 05:00:22
【问题描述】:
我知道这可能不是一个真正的问题。但是我在这里查看我开始编写的新代码并且想知道一些事情。
我必须编写通常需要在多个平台上运行的代码。我总是以两种方式处理这个问题。
当存在足够大的平台差异以致几乎要进行完整的代码重写时,我会为这些平台的模块提供单独的目录,其中包含所述平台代码,并根据平台从目录中编译源代码。
例如:
|-- module_a
|-- module_b
| |-- linux
| |-- osx
| `-- windows
`-- module_c
Makefile 将从与平台无关的 module_b 和 module_b/[os]/ 代码中调用源代码,具体取决于平台。
这一切都很好而且很酷,除非不需要重写那么多代码。那么,这往往会导致大量的复制/粘贴,我倾向于避免这种情况,因为它会导致错误,坦率地说,感觉很笨拙。
第二个变体也与我有时需要优化和未优化版本(不要问)相同代码和类似情况的问题重叠。这让我想到了函数指针。
这是第二个问题解决方案,也可以正常工作。但是,我知道函数指针可能会导致编译器在优化代码时遇到问题。
我的新代码将包含很多这样的代码,所以我提前想知道,是否有第三种可能性让运行时代码路径对编译器(可能还有 cpu?)友好?
请注意,我完全避免为此使用#ifdefs。 如果重要的话,我在所有三个平台(是的,甚至是 OSX)上使用 gcc 5.2(和快照)在 C99 中编程。所以我也对扩展持开放态度。
PS 我曾多次尝试programmers.stack,但遗憾的是,它是一座鬼城。
【问题讨论】:
-
请不要批评其他无法为问得不好的问题提供答案的平台。你认为我们是谁,某种神谕?您事先尝试编写的代码在哪里?
-
为什么要避免
#ifdef?对于可以静态确定的东西,这是最好的方法。 -
@Adam #ifdefs 或多或少与我对条件生成文件所做的事情相同,因此在我的情况下它们是不必要的。也许避免不是正确的词。不使用更喜欢它。它不会取代函数指针提供的运行时重新配置需求。
-
恐怕我没有完全关注你。为什么平台抽象需要运行时调度?如果您需要切换一个可选的未优化实现,比如因为快速路径依赖于不可用的 CPU 指令,那么您可以随意这样做,但在典型的操作系统可移植性情况下,您通常最好直接为每个支持的平台实现该功能。如果周围仍然有很多共享代码,则将其分流给共享助手或其他什么,或者如果差异很小,则使用
#ifdef。 -
@WeatherVane 在我被重定向到那个站点之前我是先发制人的。如果需要关闭问题,那就这样吧。还没有新代码库的代码 - 我正在查看我在过去项目中编写的内容,并且正面临一项我需要完成的新任务,并且想知道我现在是否可以完全避免使用函数指针。更像是一个规则,如果你愿意的话,填充它们的结构就像一个 API。
标签: c optimization c99