2

考虑以下使用 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。任何帮助表示赞赏。

4

1 回答 1

1

您还需要在 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";    }
}
于 2013-11-05T09:09:57.523 回答