2014-08-29 4 views
1

Я делаю некоторые сетевые программирования в Linux на данный момент, и для этого я сделал себе несколько typdefs для портативностиДолжен ли я использовать свои собственные typedefs в вызовах библиотеки?

typedef char int8; 
typedef unsigned char uint8; 

typedef short int16; 
typedef unsigned short uint16; 

typedef int int32; 
typedef unsigned int uint32; 

Теперь я в точке, где я хочу написать некоторые функции-обертки для часто используемой розетки функции. Короткий пример будет:

int32 rawSocketCreate(int* sockfd, int protocol) { 

    *sockfd = socket(AF_PACKET, SOCK_RAW, htons(protocol)); 

    if (*sockfd == -1) { 
     printf("Error creating raw socket\n"); 
     return -1; 
    } 

    return 0; 
} 

Мой вопрос сейчас: Для параметров я перехожу к библиотечным функциям, я должен продолжать использовать стандартные типы данных или использовать самостоятельно?

rawSocketCreate(int* sockfd, int protocol) 
/* OR */ 
rawSocketCreate(int32* sockfd, int32 protocol) 
+0

С ним все в порядке (означает ваше СОБСТВЕННОЕ). потому что вы напечатали его стандартным типом. –

ответ

6

C огорчает ... что случилось с <stdint.h> и стандартных определений типов, которые она предоставляет? Все, кажется, использовать TYPEDEF о его собственном изобретении, но практически никто не кажется, использует стандарт Include (который поставляется с соответствующими макросами для printf() и scanf() обработки и т.д.). ...


Если вызов API ожидает a int, вы должны пройти его int, не делая предположений о собственной ширине упомянутых int (поскольку предположения, как правило, ломаются в самые неудачные моменты).

Использовать определенную ширину typedefs, если точная ширина имеет значение, только. (Например, кросс-платформенного двоичная совместимость STRUCT макетов, драйвера устройств, ...)

+0

Замечание: Я очень хорошо знаю, почему никто не использует '', но я не могу взять * другой * промахнуться в Microsoft и их идею обслуживания компилятора, потому что ... забудьте об этом, я все их виню. ;-) – DevSolar

+0

Не могли бы вы объяснить, почему вы «очень хорошо знаете, почему никто, кажется, не использует stdint.h». Есть ли недостаток? – happyMOOyear

+1

@happyMOOyear: [MSVC не поставляется с , вам необходимо загрузить/поставить свой собственный] (http://stackoverflow.com/questions/126279). Прямая цитата из поддержки MS: «C99-совместимость не является для нас приоритетной задачей». Это от, мм, 2008 или около того.(В настоящее время они обрабатывают C++ 11 тем же способом.) Microsoft полностью довольна вложением API. Нет причин не использовать заголовок, но причина, почему многие люди даже не знают о ее существовании. – DevSolar

2

Вы должны НЕ использовать свои собственные определений типов, поскольку стандартный <stdint.h> заголовок обеспечивает лучшую альтернативу - поскольку это стандарт.

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

2

Когда вы набираете основные типы, вы хотите улучшить свой код с переносимостью. Неправильно смешивать зависимые от платформы типы (int) с типами typedef (int32) в вашем коде. Если вы это сделаете, ваш код по-прежнему зависит от платформы.

Кроме того, я предлагаю вам взглянуть на файл stdint.h, который уже содержит все эти определения.

Надеюсь, это поможет.

Carles.

Смежные вопросы