2017-07-06 5 views
0

以下のC++のOpenCLコードをg ++ -c no_x.cppと微細コンパイル有効: OpenCLのベクトルタイプ:C++ 11とUNION句成分X、Y、Zにアクセスできないは

// no_x.cpp 
#include <CL/cl.h> 

void func() { 
    cl_double2 xy; 
    xy.x = 1.0; 
    xy.y = 2.0; 
} 

しかしCと

++を - 私はxy.s [0]、xy.s [1]などでそれを回避することができます

$ g++ -std=c++11 -c no_x.cpp 
nox.cpp: In function ‘void func()’: 
nox.cpp:7:7: error: ‘union cl_double2’ has no member named ‘x’ 
    xy.x = 1.0; 
    ^
nox.cpp:8:7: error: ‘union cl_double2’ has no member named ‘y’ 
    xy.y = 2.0; 
    ^

が、それは、OpenCLのは.Xを提供する理由確かである(醜い:11は、エラーが発生します同じファイルを有効に.yコンポーネント)。これを引き起こしているC++ 11とは何ですか?私は一般にC++ 11でOpenCLをコンパイルできませんか? OpenCLのヘッダで

+0

xy.s [0]は最もポータブルな方法ですが、醜いですが動作します。 – DarkZeros

答えて

1

(cl_platform.h、cl.hによって含まれている)、cl_double2は次のように定義されています

typedef union 
{ 
    cl_double CL_ALIGNED(16) s[2]; 
#if defined(__GNUC__) && ! defined(__STRICT_ANSI__) 
    __extension__ struct{ cl_double x, y; }; 
    __extension__ struct{ cl_double s0, s1; }; 
    __extension__ struct{ cl_double lo, hi; }; 
#endif 
#if defined(__CL_DOUBLE2__) 
    __cl_double2  v2; 
#endif 
}cl_double2; 

だから、あなたのコンパイラは、GNUのプリプロセッサを使用するか、または__STRICT_ANSI__をもしていない場合が定義されている場合(g++ may define it)、そのメンバーにアクセスすることはできません。

+0

hmmm openclの私のバージョンがあなたが見ているものよりも古いか新しくなっているのか分かりませんが、鉱山は__CL_HAS_ANON_STRUCT__によって制御されています。そして、以前はSTRICT_ANSIに依存しています。 -std = C++ 11はそれを定義します。 – RubeRad

+0

@ user2387508 '-std = C++ 11'で定義されていますが、単にg ++でパラメータ' -U__STRICT_ANSI__'を使うことができます。 – Lovy

+0

ああ甘い!それはトリック、ありがとう! – RubeRad

関連する問題