Как эффективно решить проблему "u_int8_t vs uint8_t" - PullRequest
4 голосов
/ 23 июня 2010

Я пытаюсь собрать пакет (libnet) в Solaris и обнаружил, что в Solaris нет u_xxx_t, но uxxx_t определено в sys / types.h

У меня было 2 вопроса:

1-Разве автоинструменты не должны позаботиться об этом для меня?

2-Я полагаю, я не первый, кто сталкивается с этим (хотя Google не помог), есть ли стандарт / эффективный/ правильный / быстрый способ преодоления этого?

Ответы [ 4 ]

15 голосов
/ 23 июня 2010

Самый разумный способ преодолеть это - придерживаться стандартного написания имен типов (даже если этот стандарт является "будущим" для используемой вами реализации). C99 ввел стандартную номенклатуру для таких имен типов, а в C99 это uint8_t. Таким образом, даже если вы используете компилятор C89 / 90, я бы посоветовал вам использовать uint8_t в своем коде. Если на какой-либо платформе она недоступна или пишется по-другому, вы просто вводите имя typedef для конкретной платформы, которое «преобразует» написание

typedef u_int8_t uint8_t;

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

7 голосов
/ 23 июня 2010

Типовое имя uint8_t является стандартным, поэтому я не уверен, где вы нашли u_int8_t.

Это достаточно просто, что вы можете сделать это быстрым, тупым способом с perl (или sed, если необходимо) и исправить любые незначительные проблемы, которые он вызывает, вручную:

perl -pi.orig -e "s/\bu_(\w+_t)\b/u$1/g" *.c

(Это сохранит исходные, неизмененные файлы с суффиксом .orig.)

1 голос
/ 23 июня 2010
  1. Нет
  2. Использовать условные директивы препроцессора, т.е. #define u_xxx_t uxxx_t или же typedef, завернутый в блок #ifdef, т.е. typedef u_xxx_t uxxx_t
0 голосов
/ 25 июня 2010

Спасибо всем за ответы, я кое-чему научился. Прежде всего, о старом стандарте именования кажется, что сам пакет старый и не очень поддерживается, домашняя страница, кажется, не работает Просматривая код, я нашел typedefs:

#if (__sun && __SVR4)
/* libnet should be using the standard type names, but in the short term
 * define our non-standard type names in terms of the standard names.
 */
#include <inttypes.h>
typedef uint8_t  u_int8_t;
typedef uint16_t u_int16_t;
typedef uint32_t u_int32_t;
typedef uint64_t u_int64_t;
#endif

Оригинал #if был таким:

#if (__sun__ $$ svr4)

Оба макроса в системе определены по-разному. После смены все заработало нормально.

Еще раз спасибо!

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