考虑以下使用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"; }
}