2014-09-13 4 views
2

Я имел этот метод (упрощенный):Общий интерфейс для функции

void addraw(struct chain*a, uint8_t *data). 

Суть в том, я мог бы назвать его от функций, таких как:

void adduint16(struct chain*a, uint16_t val) 
{ 
    uint8_t x[2] = {0}; 
    memcpy(x, &val, 2); 

    addraw(chain, x); 
} 

Say теперь, если у меня есть метод:

void addstr(struct chain*a, char* val) 

Я мог бы легко сделать:

void addstr(struct chain*a, char* val) 
{ 
    addraw(chain, (uint8_t*) val); 
} 

Но я думаю, что это не всегда нормально пройти char *, как uint8_t указатель и т.д.

Так оказывают функцию addraw такого прототип лучше?

void addraw(struct chain*a, void *data) 

можно ли избежать проблемы с литой? и по-прежнему использовать Как я хочу? например, с помощью цепей и струн, как я показал выше,

+0

Это код C. Не C#. – itsme86

+0

'uint8_t x [2] = {0}; memcpy (x, & val, 2); '... вы копируете только 16 бит 32-битного значения? – nneonneo

+0

@nneonneo Откуда вы получаете 32 бита? – Marlon

ответ

1

[прототип с void*] избегает проблемы с литьем?

Да, прототип с void* позволит вам избегать указателей поворота в точке вызова.

[могу ли я] использовать Как я желаю?

Это зависит от того, что вы хотите сделать: если вы планируете интерпретировать данные, на который указывает указатель data в качестве данных, указывающих на беззнаковых данных, и передать подписанные данные вместо этого, вы получите поведение конкретной реализации. Если все, что вам нужно сделать, это копирование «сырых» данных из одного буфера в другой, void* - идеальный выбор.

0

Вы сказали,

Но я думаю, что это не всегда нормально пройти char *, как uint8_t указатель и т.д.

Короткий ответ: Вы правы.

Более длинный ответ: Зависит от вашей платформы, если char на вашей платформе является целым значением без знака, вы должны быть в порядке. Если нет, вы, вероятно, столкнетесь с проблемами, связанными с смешиванием значений целого числа без знака и без знака.

Проблема не исчезнет, ​​изменив сигнатуру addraw на:

void addraw(struct chain*a, void *data) 

Это будет появляться, чтобы уйти, когда вы скомпилировать файл, в котором используется adddraw. Однако, внутри adddraw, вы конвертировали data в указатель uint8_t* или char*.В то же время необходимо решить проблему смешения целых чисел без знака.

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