Перенос кода windows, что использовать вместо __int64 _tmain и _TCHAR *?

В настоящее время я портирую код Windows и пытаюсь сделать его доступным для использования в Ubuntu. Изначально проект был скомпилирован на VC ++ без каких-либо проблем. Также я должен отметить, что это должно работать только в Ubuntu, но, безусловно, приветствуются идеи, не зависящие от платформы.

Большую часть кода легко перенести, поскольку это в основном проект численного моделирования с несколькими частями, специфичными для ОС. В перенесенной версии не используется UNICODE, и нет необходимости поддерживать его.

Я хотел бы знать, каковы лучшие практики при попытке скомпилировать этот код с помощью GCC, в частности:

Что считается лучшей заменой для: __int64, _tmain и _TCHAR *?

Спасибо!


person shuttle87    schedule 24.06.2010    source источник


Ответы (3)


Для 64-битной версии:

#include <inttypes.h>
typedef int64_t __int64;

Что касается проблемы TCHAR. На самом деле я нахожу TCHAR довольно полезными, поэтому у меня есть файл со всеми функциями _t, которые я использую в нем.

e.g

#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

что касается функций _s в основном ... Я их реализовал. На кодирование уходит около часа, но это НЕМНОГО упрощает перенос проектов на другие платформы или компиляторы.

person Goz    schedule 24.06.2010

GCC поддерживает long long (в зависимости от флагов компиляции), которое является 64-значным целым числом. Или вы можете использовать std::int64_t из заголовка cstdint.

Или, чтобы быть более кроссплатформенным, используйте boost/cstdint.hpp, который определяет boost::int64_t

_tmain просто Microsoft ведет себя глупо (или нестандартно, если хотите). Остальной мир использует main, просто и ясно. _TCHAR не имеет прямого эквивалента, но поскольку вы говорите, что вам не нужна поддержка wchar_t, вы можете просто заменить его char.

person jalf    schedule 24.06.2010
comment
Это не совсем глупо, но исторически. _tmain() является результатом решения MS перейти на UCS-2 для Unicode, когда ни одна из основных ОС не поддерживала Unicode. UCS-2 был основан на 16-битных символьных единицах, поэтому main() требовался аналог широкого символа / Unicode, а _tmain() был преобразован либо в main(), либо в 16-битный символьный эквивалент, в зависимости от того, была ли скомпилирована сборка Unicode или нет. Позже другие ОС пошли с версиями UTF-8, которые были основаны на 8-битных единицах символов, поэтому main() все еще можно было использовать, и Windows перешла с UCS-2 на UTF-16, который по-прежнему основан на 16-битных единицах символов. - person hippietrail; 20.03.2013

Вы можете использовать qint64 из Qt framework (независимо от платформы), но, вероятно, есть более простые способы.

person metdos    schedule 24.06.2010