2011-01-12 4 views

ответ

1

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

6

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

0

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

0

Как уже было сказано, вам не нужно писать префикс 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

Я не могу сказать определенно вещь, как я не знаю, ваш фактический контекст, но если вы видите ошибку, когда вы пишете (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 
} 
Смежные вопросы