Permettant VLAs (de longueur variable tableaux) en MS Visual C++?
Comment puis-je activer l'utilisation de VLAs, de longueur variable des tableaux tels que définis dans C99, MS Visual C++ ou qui n'est pas du tout possible?
Oui, je sais que la norme C++ est basé sur C89 et que Blaise ne sont pas disponibles en C89 standard et ne sont donc pas disponibles en C++, mais MSVC++ est censé être un compilateur C aussi, un comportement qui peut être activée à l'aide de l' /TC compilateur paramètre (Compile as C Code (/TC)
). Mais cela ne semble pas permettre à Blaise et le processus de compilation échoue avec les mêmes erreurs lors de la construction du C++(Compile as C++ Code (/TP)
). Peut-être que MSVC++ le compilateur C est C89 conforme uniquement ou il me manque quelque chose(certains spéciales de construction ou de pragma/définir)?
Exemple de Code:
#include <stdlib.h>
int main(int argc, char **argv)
{
char pc[argc+5];
/* do something useful with pc */
return EXIT_SUCCESS;
}
Les erreurs de compilation:
erreur C2057: attendu expression constante
erreur C2466: ne peut allouer un tableau de taille constante 0
erreur C2133: 'pc' : inconnu taille
std::vector
au lieu d'un VLA. Les conseils n'aide pas à cette question en raison de la C exigence, cependant.OriginalL'auteur Shinnok | 2011-03-09
Vous devez vous connecter pour publier un commentaire.
MSVC n'est pas un compilateur C99, et ne supporte pas la longueur variable des tableaux.
À https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance MSVC est documentée comme étant conforme à C90.
Qui tranche le litige alors. 🙂 Il y a une extension Microsoft à la langue qui permet à Blaise? GCC a un, leur permettant ainsi de C90 et C++, en plus de C99 de la conformité. gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
Je pense que le lien Jean à condition indique qu'il n'y en a pas, et ne le sera pas de si tôt.
Que le retour est à partir de 2008, mais c'est probablement le cas pour aujourd'hui aussi. Merci pour les réponses.
Il n'y a pas de support pour VLAs. MS vous suggérons d'utiliser le C++ mode du compilateur, avec std::vector comme un remplacement pour VLAs.
OriginalL'auteur
VLA sont beaucoup plus propres à écrire, mais vous pouvez obtenir le même comportement à l'aide de
alloca()
lors de l'allocation dynamique de la mémoire destd::vector
est prohibitif.http://msdn.microsoft.com/en-us/library/x9sx5da1.aspx
À l'aide de
alloca()
dans votre exemple, donnerait:alloca
et son ami_alloca
est déprécié en faveur de_malloca
dans les versions plus récentes de msvc. Et que la fonction est tellement ennuyeux à utiliser qu'il est préférable de simplement déclarer un tableau de longueur constante et l'utiliser.n'avez pas, vous avez pour libérer la mémoire allouée par alloca ?
Pas de. Comme la mémoire allouée par alloca() est sur la pile, il est automatiquement récupérée lors de la pile est déroulée. Consultez la documentation de votre version pour plus de détails.
ok merci pour l'information.
La raison principale de l'utilisation
alloca
est parce que la pile de la mémoire est plus rapide que la mémoire du tas. Mais_malloca
n'est pas garanti de retour de mémoire de pile sens imprévisible de la performance dans le dur-à-debug cas de bord lorsque la pile est presque plein. Dans ces scénarios, vous aurez impossible pour déboguer des fuites de mémoire qui n'est pas autrement se produire lorsque vous oublier de libérer la mémoire allouée. Aucun des outils comme valgrind peut aider, parce que 99% du temps, la mémoire est prise à partir de la pile de sorte que la fuite n'est pas là! Imaginez le débogage d'un memleak qui ne se produit que sur certaines machines, car ils ont une plus petite taille de la pile...OriginalL'auteur
J'ai rencontré le même problème, ce n'est pas possible en MS Visual C++ 2015, au lieu de cela, vous pouvez utiliser le vecteur de faire presque la même, la seule différence est négligeable généraux des tas de ressources à gérer la routine(new/delete).
Bien que Blaise est pratique, mais d'allouer des non-déterministe de la quantité de mémoire de la pile à risque de débordement de pile est généralement pas une bonne idée.
OriginalL'auteur