139 votes

#pragma est une fois qu’une partie du C ++11 standard ?

Traditionnellement, le standard et portable de façon à éviter la pluralité de l'en-tête des inclusions en C++ a été/est d'utiliser l' #ifndef - #define - #endifpré-directives du compilateur scheme également appelé macro-garde schéma (voir l'extrait de code ci-dessous).

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif

Dans la plupart des implémentations/compilateurs (voir photo ci-dessous) cependant, il y a de plus "élégant" alternative qui sert le même but que la macro-garde appelées #pragma once. #pragma once a plusieurs avantages par rapport à la macro-garde de régime, y compris les moins de code, d'éviter les collisions de noms, et parfois, l'amélioration de la compilation de la vitesse.

enter image description here

En faisant quelques recherches, j'ai réalisé que, bien #pragma once directive est prise en charge par presque tous connu des compilateurs, il y a un turbidness qu' #pragma once directive fait partie du C++11 standard ou pas.

Questions:

  • Quelqu'un pourrait-il préciser si l' #pragma once directive fait partie du C++11 standard ou pas?
  • Si elle ne fait pas partie du standard C++11, il y a des plans sur y compris sur les versions ultérieures (par exemple, C++14 ou plus tard)?
  • Il serait bien aussi si quelqu'un pouvait élaborer davantage sur les avantages/inconvénients en utilisant l'une des techniques (c'est à dire, la macro-garde contre #pragma once).

105voto

James Kanze Points 96599

#pragma once est pas standard. Il est largement répandu (mais pas universelle) de l'extension, qui peut être utilisé

  • si votre portabilité préoccupations sont limitées, et
  • vous pouvez être sûr que tous vos fichiers sont toujours sur un disque local.

Il a été considéré pour la standardisation, mais rejeté, car il ne peut pas être mis en œuvre de manière fiable. (Les problèmes se produisent lorsque vous les fichiers accessibles par le biais de plusieurs à distance différents supports.)

Il est assez facile de s'assurer qu'il n'y a pas d'inclure de la garde les conflits au sein d'un seul développement. Pour les bibliothèques, ce qui peut être utilisé par de nombreuses évolutions, la solution la plus évidente est pour générer un grand nombre de caractères aléatoires pour l'inclure garde lorsque vous le créez. (Un bon éditeur peut être mis en place pour ce faire, pour vous chaque fois que vous ouvrez un nouvel en-tête.) Mais même sans cela, Je n'ai pas encore rencontrer des problèmes avec les conflits entre des bibliothèques.

32voto

Jefffrey Points 31698

L'article 16.6 de la Norme (N3936 projet) décrit #pragma directives:

Un prétraitement de la directive de la forme

# pragma pp-tokensopt new-line

les causes de la mise en œuvre de comportement définis par l'implémentation manière. Le comportement peut provoquer la traduction de l'échec ou de la cause de la traducteur ou le programme résultant d'un comportement non conforme manière. Tout pragma qui n'est pas reconnue par la mise en œuvre est ignoré.

Fondamentalement, #pragma once est une mise en instance spécifique d'un #pragma directive, et non, ce n'est pas la norme. Encore.

Il est souvent largement pris en charge par la plupart des "grands compilateurs", y compris la GCC et Clang et est donc parfois recommandé d'éviter d'inclure des gardes-standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X