2017-07-06 5 views
0

Le code suivant C++ OpenCL compile très bien avec g ++ -c no_x.cpp:OpenCL types de vecteurs: Impossible d'accéder aux composants x, y filles fusionnées, avec z 11 C++ permis

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

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

Mais avec C++ - 11 a permis le même fichier donne des erreurs:

$ 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; 
    ^

Je peux contourner avec xy.s [0], xy.s [1] etc, mais c'est laid (ce qui est sans doute pourquoi OpenCL offre la .x, .y composants). Qu'est-ce qui se passe avec C++ 11 qui en est la cause? Puis-je en général ne pas compiler OpenCL avec C++ 11?

+0

xy.s [0] est le moyen le plus portable, c'est moche mais ça marche. – DarkZeros

Répondre

1

Dans les en-têtes de OpenCL (cl_platform.h, inclus par cl.h), cl_double2 est défini de la manière suivante:

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; 

Donc, si votre compilateur n'utilise pas le préprocesseur GNU, ou si __STRICT_ANSI__ est défini (g++ may define it), vous ne pourrez pas accéder à ces membres.

+0

hmmm, je ne sais pas si ma version d'opencl est plus ancienne ou plus récente que celle que vous regardez, mais la mienne est contrôlée par __CL_HAS_ANON_STRUCT__, et je vois plus tôt dans cl_platform.h que cela dépend de STRICT_ANSI, je suppose -std = C++ 11 le définit. – RubeRad

+0

@ user2387508 '-std = C++ 11' le définit, mais vous pouvez simplement utiliser le paramètre' -U__STRICT_ANSI__' dans g ++. – Lovy

+0

Oh chéri! Ça fait l'affaire, merci! – RubeRad