2

我在使用 XCode 4.5 DP1 安装附带的 Clang 3.1 的 C++11 用户定义文字时遇到问题

编译器看起来支持它们,我可以定义一个新的文字。我可以直接调用文字函数,但是当我在代码中使用文字时,会出现编译器错误。

在 Xcode 上自动完成甚至在字符串后输入下划线时建议我的新文字:D

这是代码:

#include <cstring>
#include <string>
#include <iostream>

std::string operator "" _tostr (const char* p, size_t n);

std::string operator"" _tostr (const char* p, size_t n)
{ return std::string(p); }

int main(void)
{
    using namespace std;

    // Reports DOES has string literals

#if __has_feature(cxx_variadic_templates)   
    cout << "Have string literals" << endl;
#else
    cout << "Doesn't have string literals" << endl;
#endif

    // Compiles and works fine
    string x = _tostr("string one",std::strlen("string one"));
    cout << x << endl;

    // Does not compiler
    string y = "Hello"_tostr;
    cout << y << endl;

    return 0;
}

我收到以下错误:

[GaziMac] ~/development/scram clang++ --stdlib=libstdc++ --std=c++11 test.cpp 
test.cpp:22:23: error: expected ';' at end of declaration
    string y = "Hello"_tostr;
                      ^
                      ;
1 error generated.

这是 clang 的版本信息

[GaziMac] ~/development/scram clang++ -v
Apple clang version 4.0 (tags/Apple/clang-421.10.42) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.0.0
Thread model: posix

感激地收到任何帮助:)

4

2 回答 2

4

我没有 Clang,但 Google 找到了一个页面列表 __has_feature选择器。

使用 __has_feature(cxx_user_literals) 确定是否启用了对用户定义文字的支持。

于 2012-06-17T11:28:49.460 回答
1

我在使用 XCode 4.5 DP1 安装附带的 Clang 3.1 的 C++11 用户定义文字时遇到问题

那就是问题所在。XCode 4.5 DP1 不附带 Clang 3.1。Apple clang version 4.0 (tags/Apple/clang-421.10.42) (based on LLVM 3.1svn)是 3.0 和 3.1 之间的 Clang 主干的一个切口,在我用一个工作的部分替换损坏的部分实现之前。

正如 Potatoswatter 所观察到的,在 Clang 中测试此功能的正确方法是__has_feature(cxx_user_literals).

以下是 Clang trunk 对您的代码的评价:

<stdin>:23:16: error: use of undeclared identifier '_tostr'; did you mean 'strstr'?
    string x = _tostr("string one",std::strlen("string one"));
               ^~~~~~
               strstr
/usr/include/string.h:340:14: note: 'strstr' declared here
extern char *strstr (__const char *__haystack, __const char *__needle)
             ^

...这表明了不适当的错字更正,但至少它是一个正确的诊断,并且您对用户定义文字的使用被接受。

于 2012-09-15T07:05:13.707 回答