Вопрос кастинга на C ++ (структура) - PullRequest
0 голосов
/ 12 января 2011

В моем приложении C ++ у меня есть определение:

struct socksddr_storage ss;
struct sockaddr *sa;

в чем разница между:

sa = (struct sockaddr *)&ss; 

и

sa = (sockaddr *)&ss;

???

Любая помощь?

Ответы [ 5 ]

6 голосов
/ 12 января 2011

Разницы между ними нет.Типовое преобразование с присутствующим ключевым словом struct восходит ко временам C, когда тип struct включал ключевое слово "struct" и поэтому фраза "typedef struct" стала популярной.C ++ исключил необходимость использования этого ключевого слова в этом контексте, но сохранил синтаксис для обратной совместимости.

1 голос
/ 12 января 2011

В C ++ нет никакой разницы, поскольку ключевое слово struct является необязательным.В Си вторая форма не является законной.

0 голосов
/ 12 января 2011

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

void f( void* p )
{
  int stat( char const*, struct stat* );
  struct stat *a = (struct stat*) p; // cannot omit this struct
}
0 голосов
/ 12 января 2011

Как уже говорили другие, вам не нужно писать префикс struct в c ++, так как компилятор может определить правильный тип только по имени.Но я предлагаю использовать reinterpret_cast в этой ситуации, поскольку приведение стиля c - это приведение большого молотка, которое приводит типы и константные спецификаторы за один раз.

struct socksddr_storage ss;
const struct socksddr_storage ss2;
struct sockaddr *sa;

sa = reinterpret_cast<sockaddr *>(&ss); // Works like the C Cast
sa = reinterpret_cast<sockaddr *>(&ss2); // Fails, because ss2 is a constant,
 // but sa is a pointer to a no const memory location. The C cast will allow
 // this assignment, but this can lead to runtime errors since the linker
 // can place ss2 into read-only memory.
0 голосов
/ 12 января 2011

Разница в том, что (struct sockaddr*) является допустимым приведением как в C, так и в C ++, где (sockaddr*) допустимо в C ++, но не в C. Оба приведения дают одинаковый результат.

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