Dois-je utiliser des long long ou int64_t pour portable code?

J'ai un open-source code qui est écrit en C et en C++. Je suis à la recherche d'un type entier, qui est garanti pour être au moins 64 bits de large, qui peut être fiable compilé sur la plupart des OS X (Intel 64 bits) et Linux boîtes avec open-source compilateurs C et C++, sans trop de travail supplémentaire sur l'utilisateur final de la partie. Windows 32 bits et de soutien au client ne sont pas important à ce moment.

J'ai fait quelques tests sur OS X, et la dernière version de GCC qui est livré avec les outils de développement ne prend pas en charge C+11 mode (et ne semble donc pas vous garantir la disponibilité de long long). Clang ne prend pas en charge ce, soit, si elle prend en charge long long si C99 mode est activé, après une certaine version.

Est la suggestion générale à utiliser int64_t en place de long long, lorsque la portabilité est un objectif important? En utilisant les spécificateurs de format semble douloureux.

Puis-je de manière fiable jeté un int64_t à long long (et de même pour le unsigned équivalent avec uint64_t) pour l'utiliser avec les fonctions existantes et les bibliothèques qui prennent long long comme paramètres? (Et d'en revenir, bien sûr.)

Dans cet état d'esprit, si j'envoie un code qui nécessite Clang fonctionnalités qui ne sont pas dans GCC, Clang est-ce qui va remplacer GCC comme compilateur de choix sur Linux? C'est que le compilateur quelque chose que je peux attendre, pour la plupart, en proposant le code source aux utilisateurs finaux?

En gros, j'aimerais demander l'avis d'autres développeurs qui ont utilisé les deux types de portable code C et C++, qui pourrait avoir des suggestions sur ce qui pourrait être le mieux à long terme du chemin à faire, compte tenu de l'objectif ci-dessus à l'esprit.

  • gcc a eu long long comme une extension avant c++11, donc tant que vous ne désactivez pas l'gcc-extensions, vous devez être bien avec l'aide de long long sur gcc (en Fait je ne pense pas que j'ai utilisé/vu un compilateur n'offrant pas de long pour une longue période).
  • Notez que int64_t peut avoir le type sous-jacent long ou long long entre autres, ce qui peut causer des problèmes de portabilité si la surcharge est nécessaire.
  • Également envisager de typedef pour faciliter les changements de plate-forme à plate-forme.
  • Une chose à considérer est que, en utilisant les surcharges ou les modèles avec int64_t pouvez sélectionner différentes versions sur différents systèmes. Voir cette autre question sur int64_t vs vs longue longue longue