加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

内联命名空间技术,用于管理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给出了特定的代码和示例用法.
https://github.com/dchichkov/curious-namespace-trick/wiki/Curious-Namespace-Trick

我想知道它是否是一种可行的技术,或者是否有任何我无法看到的陷阱.以下是代码段:

#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内联命名空间使代码不易读取且过于冗长.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读