Est la barre oblique inverse acceptable en C et C++ #include directives?
Il y a deux séparateurs de chemin dans l'usage commun: Unix barre oblique et le DOS de la barre oblique inverse. de Repos dans la paix, Mac Classic côlon. Si elle est utilisée dans une directive #include, sont-ils égaux en vertu des règles du C++11, C++03, et C99 normes?
- Noms de chemin d'accès sont un OS détail d'implémentation. Comme c'est le compilateur paramètre que vous souhaitez utiliser pour éviter d'avoir à spécifier un nom de répertoire dans une directive #include.
Vous devez vous connecter pour publier un commentaire.
C99 dit (§6.4.7/3):
C++03, dit (§2.8/2):
C++11 dit (§2.9/2):
Par conséquent, bien que tout le compilateur peut choisir à l'appui d'une barre oblique inverse dans une
#include
chemin, il est peu probable que tout fournisseur de compilateur ne supportent pas de barre oblique, et les barres obliques inverses sont susceptibles de voyage, quelques implémentations en vertu de former des codes d'échappement. (Edit: apparemment MSVC précédemment requis barre oblique inverse. Peut-être que d'autres sur le DOS dérivé de plates-formes similaires. Hmmm... ce que je peux dire.)C++11 semble à desserrer les règles, mais "conditionnellement pris en charge" n'est pas significativement mieux que "provoque un comportement indéfini." Le changement n'a plus afin de refléter l'existence de certains populaire compilateurs que de décrire un portable standard.
Bien sûr, aucune de ces normes est dit que il ya une telle chose comme des chemins. Il y sont systèmes de fichiers ayant pas de chemins à tous! Cependant, de nombreuses bibliothèques assumer les chemins, y compris la norme POSIX et coup de pouce, il est donc raisonnable de vouloir un portable moyen de faire référence à des fichiers dans les sous-répertoires.
for (int i=0; i<size; i++) if (ptr1+i==ptr2) return 1;
est l'équivalent de ce qu'est un unoptimized compilateur sur la plupart des plates-formes seraient rendement pourif (ptr2>=ptr1 && ptr2<ptr1+i) return 1;
, mais si les paramètres du compilateur serait une garantie de deux formes équivalentes de ce dernier n'aurait pas besoin d'optimisation à effectuer décemment. Il peut y avoir certains modules où l'élagage de certaines formes de l'AC pourrait améliorer les performances, mais il y a certainement d'autres où la définition de certaines formes de actuellement-UB pourrait permettre à plus sensible que le code interdire leur.#include <sys/time.h>
, car il y a beaucoup de code en cours de porté sur celle-ci qui a utilisé exactement la même forme. Peut-être que je me souviens pas correctement, mais alors vous devez vous demander comment épais, ils devraient être, pour la fourniture de ce fichier à des fins de compatibilité, et puis vous faire changer la source de l'utiliser. Rappel c'était l'époque où il y avait beaucoup beaucoup plus de code porté pour MSC...Barre oblique est la façon correcte; le pré-compilateur va faire ce qu'il faut sur chaque plate-forme pour obtenir le fichier.
Blackslash est un comportement indéfini, et même avec une barre oblique, vous devez être prudent. Le standard C99 états:
Cela dépend de ce que tu veux dire par "acceptable".
Il y a deux sens dans lequel les barres obliques sont acceptables et les barres obliques inverses ne sont pas.
Si vous êtes à la rédaction de C99, C++03, ou C1x, les barres obliques inverses ne sont pas définis, tandis que les barres obliques sont juridiques, ainsi, dans ce sens, les barres obliques inverses ne sont pas acceptables.
Mais cela est sans importance pour la plupart des gens. Si vous êtes à la rédaction de C++1x, où les barres obliques inverses sont soumises à conditions-prise en charge, et la plate-forme de codage pour les soutient, ils sont acceptables. Et si vous êtes en train de rédiger une "longue" dialecte de C99/C++03/C1x qui définit les barres obliques inverses, même affaire. Et, plus important encore, cette notion de "acceptable" est assez vide de sens dans la plupart des cas, de toute façon. Aucun des C/C++ normes de définir ce que les barres obliques moyenne (ou ce que les barres obliques inverses veux dire quand ils sont conditionnellement-pris en charge). Noms d'en-tête sont mappés à des fichiers source dans l'œuvre de la manière définie, période. Si vous avez une hiérarchie de fichiers, et vous vous posez la question de savoir si l'utilisation des barres obliques inverses ou des barres obliques à les consulter de façon portable dans les directives #include, la réponse est: ni l'un est portable. Si vous voulez écrire véritablement portable code, vous ne pouvez pas utiliser les hiérarchies de fichiers d'en-tête—en fait, sans doute, votre meilleur pari est de tout écrire en un seul fichier source, et non pas #inclure quoi que ce soit à l'exception des en-têtes standard.
Cependant, dans le monde réel, les gens veulent souvent "portable " suffisamment", pas "strictement portable". La norme POSIX mandats ce que les barres obliques veux dire, et même au-delà de la norme POSIX, la plupart des plateformes modernes—y compris Win32 (et Win64), la croix-compilateurs pour l'embarqué et des plates-formes mobiles comme Symbian, etc.—traiter les barres obliques POSIX façon, au moins dans la mesure du C/C++ #include directives. Toute plate-forme qui n'est pas le cas, ce ne sera probablement pas de toute façon pour vous d'obtenir votre arborescence des sources sur elle, processus de votre makefile/etc., et ainsi de suite, de sorte que les directives #include sera le cadet de vos soucis. Si c'est ce que vous vous souciez, puis les barres obliques sont acceptables, mais les barres obliques inverses ne sont pas.
Toujours utiliser des barres obliques - ils travaillent sur plusieurs plates-formes. Barre oblique inverse techniquement provoque un comportement indéterminé en C++03 (2.8/2 dans la norme).
/
comme séparateur de répertoire. Les barres obliques inverses sont maintenant de mise en œuvre de comportement défini en C++0x mais alors, est donc la plupart des autres choses environnantes comprend.Que dit la norme pour les #include qu'il:
Remarque la dernière phrase.