GCC 函数多版本控制和命名空间

GCC function multiversioning and namespaces

本文关键字:命名空间 版本控制 函数 GCC      更新时间:2023-10-16

考虑以下使用GCC函数多版本控制的代码片段。

//ver.h
#include<string>
namespace nt {
__attribute__ ((target ("default"))) std::string version();
__attribute__ ((target ("sse2")))    std::string version();
__attribute__ ((target ("ssse3")))   std::string version();
__attribute__ ((target ("sse4")))    std::string version();
}
//ver.cpp   
#include "ver.h"
using namespace nt;    
__attribute__ ((target ("default"))) std::string nt::version() { return "default"; } 
__attribute__ ((target ("sse2")))    std::string nt::version() { return "sse2";    } 
__attribute__ ((target ("ssse3")))   std::string nt::version() { return "ssse3";   } 
__attribute__ ((target ("sse4")))    std::string nt::version() { return "sse4";    }

如果函数位于全局命名空间中,则代码工作正常。但是,当它们包装在命名空间中时,编译失败,并

error: missing ‘target’ attribute for multi-versioned std::string nt::version()

我正在使用 GCC 4.8.2。任何帮助,不胜感激。

您还需要在 nt 命名空间中定义函数。

//ver.cpp   
#include "ver.h"
namespace nt {
  __attribute__ ((target ("default"))) std::string version() { return "default"; } 
  __attribute__ ((target ("sse2")))    std::string version() { return "sse2";    } 
  __attribute__ ((target ("ssse3")))   std::string version() { return "ssse3";   } 
  __attribute__ ((target ("sse4")))    std::string version() { return "sse4";    }
}