小编pie*_*r94的帖子

c ++线程本地存储clang-503.0.40(Mac OSX)

在我以这种方式声明变量之后:

   #include <thread>
   namespace thread_space
    {
    thread_local int s;
    } //etc.
Run Code Online (Sandbox Code Playgroud)

我试图使用'g ++ -std = c ++ 0x -pthread [sourcefile]'编译我的代码.我收到以下错误:

example.C:6:8: error: thread-local storage is unsupported for the current target
static thread_local int s;
       ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用GCC 4.8.1在Linux上使用相同的标志编译相同的代码,我会得到一个正常运行的可执行文件.我在运行OSX 10.9.3的MacBook Pro上使用了clang-503.0.40(Xcode 5.1.1附带的那个).谁能解释一下我做错了什么?谢谢!!

macos xcode clang thread-local-storage c++11

16
推荐指数
1
解决办法
1万
查看次数

在c ++中的Lambda表达式,OS X的clang vs GCC

c ++的lambda表达式的一个特定属性是捕获声明它们的作用域中的变量.例如,我可以在lambda函数中使用声明和初始化的变量c,即使'c'没有作为参数发送,但是它被'[]'捕获:

 #include<iostream>
 int main ()
 {int c=5; [c](int d){std::cout<<c+d<<'\n';}(5);}
Run Code Online (Sandbox Code Playgroud)

因此预期输出为10.当至少有两个变量(一个被捕获而另一个作为参数发送)具有相同的名称时,就会出现问题:

 #include<iostream>
 int main ()
 {int c=5; [c](int c){std::cout<<c<<'\n';}(3);}
Run Code Online (Sandbox Code Playgroud)

我认为2011年的c ++标准表明,在名称重合的情况下,捕获的变量优先于lambda表达式的参数.事实上,在Linux上使用GCC 4.8.1编译代码,我得到的输出是预期的,5.如果我使用apple的clang编译器编译相同的代码(clang-503.0.40,Mac OS X 10.9.4上的Xcode 5.1.1附带的那个),我得到另一个答案,3.

我想弄清楚为什么会这样; 它只是一个苹果的编译器错误(如果该语言的标准真的说捕获的'c'具有优先权)或类似的东西?这个问题可以修复吗?

编辑

我的老师给GCC服务台发了一封电子邮件,他们回答说这显然是GCC编译器的错误,并将其报告给Bugzilla.所以Clang的行为是正确的!

macos lambda gcc clang c++11

8
推荐指数
1
解决办法
1065
查看次数

标签 统计

c++11 ×2

clang ×2

macos ×2

gcc ×1

lambda ×1

thread-local-storage ×1

xcode ×1