A quel compilateur devrais-je faire confiance?

Ce sera une question de débutant, mais j’essayais de travailler sur un petit exercice en langage C (pas en C ++ ) et je rencontrais des problèmes.

Disons que je voulais utiliser un tableau dans une méthode dont la taille dépendait de l’un des arguments:

void someFunc(int arSize) { char charArray[arSize]; // DO STUFF ... } 

Lorsque j’essaie de le comstackr en tant que fichier .c dans Visual Studio 2013, je reçois une erreur indiquant qu’une taille de tableau non constante n’est pas autorisée. Cependant, le même code fonctionne dans CodeBlocks sous un compilateur GNU. À qui devrais-je faire confiance? Est-ce normal que les compilateurs se comportent si différemment? J’ai toujours pensé que si vous faites quelque chose qu’un compilateur n’aime pas, vous ne devriez pas le faire en premier lieu car ce n’est pas une norme.

Toute entrée est utile! Je viens d’un background en Python et j’essaie de m’impliquer davantage dans la programmation avec Data-Structures and Algorithms.

Ma plate-forme est Windows, comme vous pouvez probablement le dire. S’il vous plaît laissez-moi savoir si cette question a besoin de plus d’informations avant qu’il puisse être répondu.

Les tableaux de longueur variable ( VLA ) sont une fonctionnalité C99 et Visual Studio, jusqu’à récemment, ne prenait pas en charge C99 et je ne sais pas s’il prend actuellement en charge VLA dans la dernière version. Par contre, gcc supporte C99 bien que pas complètement . gcc prend en charge VLA comme une extension en dehors du mode C99 , même en C ++ .

Dans le projet de norme C99, section 6.7.5.2 déclarants de 6.7.5.2 , paragraphe 4 :

[…] Si la taille est une expression constante entière et que le type d’élément a une taille constante connue, le type de tableau n’est pas un type de tableau de longueur variable; sinon, le type de tableau est un type de tableau de longueur variable.

Vous devez faire confiance aux compilateurs que vous utilisez et que vous souhaitez prendre en charge.

Sur ce problème particulier: les tailles de tableau non constantes sont valides en C99, qui n’est pas entièrement pris en charge par gcc ou par MSVC (compilateur C / C ++ de Microsoft). gcc , cependant, a cette fonctionnalité du standard implémentée même en dehors du mode C99, contrairement à MSVC.

Cela dépend de la norme particulière que votre compilateur C suit.

La fonctionnalité souhaitée est appelée tableau de longueur variable (VLA) et a été introduite dans la norme C99 .

Peut-être que votre Visual Studio prend en charge une version antérieure de la norme. Peut-être pourriez-vous le configurer pour prendre en charge une version ultérieure.

Notez que l’utilisation de VLA avec une taille énorme peut être une mauvaise habitude: les VLA sont généralement alloués par stack, et une stack de trames d’appel doit normalement avoir une petite taille (quelques kilo-octets au plus sur les processeurs actuels), en particulier pour le code du kernel ou pour des fonctions récursives ou fonctions multithread. Vous voudrez peut-être allouer un tas (par exemple avec calloc ) votre tableau s’il contient plus de mille mots. Ensuite, vous devrez le free plus tard.

Ceci est une extension de GCC agissant sur vous.