【发布时间】:2016-04-28 11:48:48
【问题描述】:
我已经看到使用 #ifdef 宏(例如 Eigen 库)来管理特定于平台的代码,但还没有看到任何人使用“内联命名空间”来管理特定于平台的代码。
下面的 github repo 给出了具体的代码和示例用法。 https://github.com/dchichkov/curious-namespace-trick/wiki/Curious-Namespace-Trick
我想知道这是否是一种可行的技术,或者是否有任何我看不到的陷阱。下面是代码 sn-p :
#include <stdio.h>
namespace project {
// arm/math.h
namespace arm {
inline void add_() {printf("arm add\n");} // try comment out
}
// math.h
inline void add_() {
//
printf("common add\n");
//
} inline namespace platform {inline void add() {add_();}}
inline void dot_() {
//
add();
//
} inline namespace platform {inline void dot() {dot_();}}
}
int main() {
project::dot();
return 1;
}
输出:
$g++ func.cpp -Dplatform=common ; ./a.out 普通添加
$ g++ func.cpp -Dplatform=arm ; ./a.out 手臂添加
【问题讨论】:
-
虽然链接到源代码很好,但您还应该在此处复制并粘贴最小的 sn-p 代码(并正确格式化!),以演示您所描述的内容。跨度>
-
它没有被使用,因为内联命名空间是一个新特性并且没有被广泛支持,但是这种情况是它们存在的主要原因之一。这不是真的好奇或诡计。
-
@JonathonReinhart 使用代码 sn-p 更新。
-
@CollinDauphinee 我已经看到它被用于或提到用于版本控制,但不用于选择特定于平台的代码,所以好奇。
-
你可以在没有
inline namespace的情况下做同样的事情。只需制作common和arm名称并在那里放置相同的功能。另一种方法是使它们成为类,而不是命名空间。优势 - 您可以共享通用功能并覆盖特定平台(针对每个平台)。
标签: c++ platform-specific inline-namespaces