内联命名空间技术,用于管理c中的平台特定代码
发布时间:2020-12-16 06:50:57 所属栏目:百科 来源:网络整理
导读:我已经看到使用#ifdef宏(示例Eigen库)来管理特定于平台,但是没有看到任何人使用“内联命名空间”来管理特定于平台的代码. 下面的github repo给出了特定的代码和示例用法. https://github.com/dchichkov/curious-namespace-trick/wiki/Curious-Namespace-Tric
我已经看到使用#ifdef宏(示例Eigen库)来管理特定于平台,但是没有看到任何人使用“内联命名空间”来管理特定于平台的代码.
下面的github repo给出了特定的代码和示例用法. 我想知道它是否是一种可行的技术,或者是否有任何我无法看到的陷阱.以下是代码段: #include <stdio.h> namespace project { // arm/math.h namespace arm { inline void add_() {printf("arm addn");} // try comment out } // math.h inline void add_() { // printf("common addn"); // } 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 解决方法
至少有两种方法可以达到相同的效果.第一个有命名空间.第二个 – 在类中使用静态函数.
使用命名空间: #include <stdio.h> namespace GenericMath { void add(); void dot(); } namespace ArmMath { void add(); using GenericMath::dot; } namespace GenericMath { void add() { printf("generic add"); } void dot() { Math::add(); printf("generic dot"); } } namespace ArmMath { void add() { printf("arm add"); } using GenericMath::dot; } int main() { Math::dot(); return 1; } 有课程: #include <stdio.h> class GenericMath { public: static void add(); static void dot(); }; class ArmMath : public GenericMath { public: static void add(); }; void GenericMath::add() { printf("generic add"); } void GenericMath::dot() { printf("generic dot"); Math::add(); } void ArmMath::add() { printf("arm add"); } int main() { Math::add(); Math::dot(); return 1; } IMO内联命名空间使代码不易读取且过于冗长. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |