J'essaye de m'apprendre un peu de C ++ 17.
Pourquoi le compilateur lance-t-il une erreur pour l'extrait de code ci-dessous?
manish@Manish-Tummala:~/c_files$ g++ 6.cpp -o - 6.out 6.cpp: In function âint main()â: 6.cpp:8:23: error: âsizeâ is not a member of âstdâ std::cout << std::size(v) << '\n'; ^~~~ 6.cpp:8:23: note: suggested alternative: âsize_tâ std::cout << std::size(v) << '\n'; ^~~~ size_t 6.cpp:11:23: error: âsizeâ is not a member of âstdâ std::cout << std::size(a) << '\n'; ^~~~ 6.cpp:11:23: note: suggested alternative: âsize_tâ std::cout << std::size(a) << '\n'; ^~~~ size_t
Le compilateur lance l'erreur suivante
#include <iostream> #include <vector> #include <iterator> int main() { std::vector<int> v = { 3, 1, 4 }; std::cout << std::size(v) << '\n'; int a[] = { -5, 10, 15 }; std::cout << std::size(a) << '\n'; }
3 Réponses :
Pour la prise en charge de C ++ 17 dans GCC, veuillez vous référer à:
Pour le moment, le support C ++ 17 n'est pas activé par défaut:
Pour activer la prise en charge de C ++ 17, ajoutez le paramètre de ligne de commande
-std = c ++ 17
à votre ligne de commandeg ++
. Ou, pour activer les extensions GNU en plus des fonctionnalités C ++ 17, ajoutez-std = gnu ++ 17
.
Pour le moment, l'ABI C ++ 17 pour GCC n'est pas encore finalisé. Cela signifie que les programmes construits aujourd'hui en mode C ++ 17 peuvent ne pas être capables de se lier à des binaires passés ou futurs également compilés en mode C ++ 17 (ou se bloquer lors de l'exécution). Une ABI stable garantit une telle interopérabilité entre les versions du compilateur.
Une fois l'ABI définitive, une future version de GCC activera le mode C ++ 17 par défaut.
Votre installation g ++ doit être à la version 6 ou supérieure. Vous pouvez le vérifier avec
g++ -std=gnu++17 6.cpp -o 6.out
Si votre version g ++ est suffisamment élevée. Vous devez également l'exécuter avec l'option de ligne de commande c ++ 17.
g++ -std=c++17 6.cpp -o 6.out
ou
g++ -v
Pour VSCode: ajouter une référence explicite à C ++ 17 serait utile, ce qui peut être fait en modifiant le fichier tasks.json dans le dossier
"args": [ "-std=c++17", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ]
Vous avez besoin de l'indicateur
-std = c ++ 17
pour indiquer au compilateur d'utiliser C ++ 17. Sinon, vous pouvez fairea.size ()
@Mirko
a.size ()
ne fonctionnera pas cara
est un tableau brutint []
.std :: array
devrait être utilisé à la place@RemyLebeau True dat. Il peut toujours faire
v.size ()
etsizeof (a) / sizeof (a [0])