2010-06-24 5 views
7

Je suis en train de porter du code windows et d'essayer de le rendre disponible pour Ubuntu. Le projet a été initialement compilé dans VC++ sans aucun problème. Aussi, je devrais noter que cela doit seulement fonctionner dans Ubuntu, mais plus d'idées indépendantes de la plate-forme sont certainement les bienvenues.Portage du code Windows, que faut-il utiliser à la place de __int64 _tmain et _TCHAR *?

La plupart du code est facile à mettre en communication car il s'agit principalement d'un projet de simulation numérique avec peu de parties spécifiques au système d'exploitation. Il n'y a pas UNICODE utilisé dans la version portée et il ne sera pas nécessaire de prendre en charge cela.

Je voudrais savoir quelles sont les meilleures pratiques en essayant d'obtenir ce code pour compiler avec GCC, notamment:

Ce qui est considéré comme le meilleur remplacement pour: __int64, _tmain et _TCHAR *?

Merci!

Répondre

12

Pour les 64 bits:

#include <inttypes.h> 
typedef int64_t __int64; 

En ce qui concerne le problème TCHAR. En fait, je trouve TCHARs plutôt utile donc j'ai un fichier avec toutes les fonctions _t que j'utilise.

par exemple

#ifdef UNICODE 

#define _tcslen  wcslen 
#define _tcscpy  wcscpy 
#define _tcscpy_s wcscpy_s 
#define _tcsncpy wcsncpy 
#define _tcsncpy_s wcsncpy_s 
#define _tcscat  wcscat 
#define _tcscat_s wcscat_s 
#define _tcsupr  wcsupr 
#define _tcsupr_s wcsupr_s 
#define _tcslwr  wcslwr 
#define _tcslwr_s wcslwr_s 

#define _stprintf_s swprintf_s 
#define _stprintf swprintf 
#define _tprintf wprintf 

#define _vstprintf_s vswprintf_s 
#define _vstprintf  vswprintf 

#define _tscanf  wscanf 


#define TCHAR wchar_t 

#else 

#define _tcslen  strlen 
#define _tcscpy  strcpy 
#define _tcscpy_s strcpy_s 
#define _tcsncpy strncpy 
#define _tcsncpy_s strncpy_s 
#define _tcscat  strcat 
#define _tcscat_s strcat_s 
#define _tcsupr  strupr 
#define _tcsupr_s strupr_s 
#define _tcslwr  strlwr 
#define _tcslwr_s strlwr_s 

#define _stprintf_s sprintf_s 
#define _stprintf sprintf 
#define _tprintf printf 

#define _vstprintf_s vsprintf_s 
#define _vstprintf  vsprintf 

#define _tscanf  scanf 

#define TCHAR char 
#endif 

que pour les fonctions de _S essentiellement ... Je les ai mis en œuvre. Cela prend environ une heure de codage, mais cela facilite énormément le portage de projets vers d'autres plateformes ou compilateurs.

+0

Cela semble être une très bonne solution, merci! – shuttle87

0

Vous pouvez utiliser qint64 à partir du framework Qt (indépendant de la plate-forme), mais il existe probablement des moyens plus simples.

2

GCC prend en charge long long (en fonction des indicateurs de compilation), qui est un nombre entier 64-it. Ou vous pouvez utiliser std::int64_t de l'en-tête cstdint.

Ou pour être plus multi-plateforme, utilisez boost/cstdint.hpp, qui définit boost::int64_t

_tmain est juste Microsoft stupide (ou non standard, si vous voulez) Le reste du monde utilise main, pure et simple. _TCHAR n'a pas d'équivalent direct, mais puisque vous dites que vous n'avez pas besoin de prendre en charge wchar_t, vous pouvez simplement le remplacer par char.

+3

Pourquoi la downvote? – jalf

+1

Ce n'est pas vraiment idiot mais historique. '_tmain()' est le résultat de la décision de MS d'utiliser UCS-2 pour Unicode lorsque aucun système d'exploitation majeur ne prenait en charge Unicode. UCS-2 était basé sur des unités de caractères de 16 bits, donc 'main()' nécessitait un équivalent '' wide character ''/Unicode et '_tmain()' était résolu en' main() 'ou l'équivalent en caractères 16 bits basé sur si une compilation Unicode a été compilée ou non. Plus tard, d'autres systèmes d'exploitation sont allés avec des versions de UTF-8 basées sur des unités de caractères 8 bits, donc 'main()' pouvait encore être utilisé et Windows est passé de UCS-2 à UTF-16, qui est toujours basé sur 16 bits unités de caractères. – hippietrail

Questions connexes