компиляция на windows и linux - PullRequest
10 голосов
/ 20 июля 2009

Я новичок в c, и некоторые из них получили некоторый исходный код, написанный кем-то другим, который был скомпилирован в Windows.

После попытки сделать компиляцию на linux у меня возникают ошибки, потому что linux не поддерживает DWORD, WORD и UINT32. У меня есть 6 файлов, например. A.h, A.c, B.h, B.c, C.h, C.c. Эти ключевые слова есть во всех файлах.

Так что я думаю о 2 возможных решениях. Что лучше #define или typedef.

1)

typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned int UNINT32;

2)

#define DWORD unsigned long 
#define WORD unsigned short 
#define UINT32 unsigned int 

Во второй части мне интересно, куда мне поместить эти декларации. Должны ли они идти в заголовочных файлах или исходных файлах?

Например, я должен сделать что-то подобное в заголовочных файлах или в исходных файлах?

#ifdef WIN32
/* windows stuff */
#else
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned int UNINT32;
#endif

Большое спасибо за вышеупомянутые предложения,

Ответы [ 4 ]

14 голосов
/ 20 июля 2009

Вы сами нашли решение:

#ifdef WIN32
/* windows stuff */
#else
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned int UNINT32;
#endif

Поместите это в отдельный заголовочный файл (typedefs.h) и включите его отовсюду. Typedef всегда предпочтительнее макросов препроцессора.

Моя рекомендация: не используйте DWORD, WORD или другие типы Win32. Я обычно предпочитаю использовать стандартные типы C99: uint_t, int_t или uint16_t, uint32_t

4 голосов
/ 20 июля 2009

Typedefs определенно лучше. #defines являются макросами препроцессора и могут иметь непредвиденные последствия, потому что в основном препроцессор C выполняет глобальный поиск и замену для определений. Typedefs - это инструкции для компилятора, и они гораздо лучше подходят для того, что вы хотите сделать.

2 голосов
/ 20 июля 2009

typedef будет лучше в этом случае, потому что #define - это просто универсальный механизм, но typedef предназначен для определения типов, которые вы и делаете.

Я бы сказал, введите ваш код:

#ifdef WIN32
/* windows stuff */
#else
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned int UNINT32;
#endif

в новый заголовочный файл (с помощью #define guards / # pragma один раз), затем добавьте его из заголовочных или исходных файлов при необходимости.

1 голос
/ 20 июля 2009

Использование typedef превращает результат в фактический тип, который помещается в дерево синтаксиса. (Другими словами, компиляторы знают об этом и распознают его как часть языка.)

#define, напротив, это просто текстовая подстановка. Таким образом, компилятор никогда не узнает об этом, он просто видит то, что подставляется. Это может затруднить поиск ошибок компиляции.

В вашем случае я бы, вероятно, порекомендовал typedef. У #define есть место, но я не вижу причин, по которым вы не захотите использовать typedef здесь.

Имейте в виду, что другие библиотеки могут определять эти типы, поэтому у вас могут быть коллизии. Если вы действительно хотите быть кроссплатформенным, вы можете подумать об определении типов с помощью пространства имен вашего приложения. Нравится

myapp_dword
myapp_word

, чтобы минимизировать коллизии с другими библиотеками.

Наконец, я бы порекомендовал против всего подхода, который вы используете. Если это вообще возможно, лучше использовать только имена типов, определенные в языке и в стандартной библиотеке C (например, size_t и т. Д.). Ваш код будет более переносимым, и у вас будет меньше головной боли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...