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 に答える