предупреждение: неправильная комбинация указатель/целое число: op =

Я компилирую программу C в Solaris и получаю это предупреждение.

line 68: warning: improper pointer/integer combination: op "="

Мой код содержит

struct cmsghdr  *cmsg;

Строка 68

cmsg = CMSG_FIRSTHDR(&msg);

Структура cmsghdr и CMSG_FIRSTHDR определена в socket.h как

#define  CMSG_FIRSTHDR(m)
--
--

struct cmsghdr {
        socklen_t       cmsg_len;  
        int             cmsg_level;
        int             cmsg_type; 
};

Я включил socket.h в свой код. Но все же я получаю эту ошибку.


person Tinyspark    schedule 12.06.2012    source источник
comment
Не могли бы вы проверить, является ли SOL_SOCKET указателем?   -  person Shahbaz    schedule 12.06.2012
comment
строка 68: cmsg = CMSG_FIRSTHDR(&msg);   -  person Tinyspark    schedule 12.06.2012
comment
Затем вам нужно будет сообщить нам, как выглядит макрос CMSG_FIRSTHDR.   -  person Mr Lister    schedule 12.06.2012
comment
Что такое декларация msg?   -  person Some programmer dude    schedule 12.06.2012
comment
Вот как это декларируется. структура msghdr msg; msghdr также определен в socket.h.   -  person Tinyspark    schedule 12.06.2012
comment
#define CMSG_FIRSTHDR(m) — это не полное определение CMSG_FIRSTHDR, не так ли?   -  person Mr Lister    schedule 12.06.2012
comment
socket.h содержит только эту строку. socket.h - это заголовок ОС...   -  person Tinyspark    schedule 12.06.2012


Ответы (2)


Возможно, макрос CMSG_FIRSTHDR не выполняет корректное приведение типов, поэтому вам придется сделать это самостоятельно:

cmsg = (struct msghdr *) (CMSG_FIRSTHDR(&msg));

Также может случиться так, что внутри самого макроса есть какой-то неправильный кастинг, и в этом случае вы ничего не можете сделать, так как он находится в системном заголовке.

person Some programmer dude    schedule 12.06.2012

пожалуйста, проверьте, какой тип SOL_SOCKET. Он должен быть внутр. Измените тип поля «cmsg_level» в вашей структуре, если он не совпадает.

Я предполагаю, что SOL_SOCKET - это указатель, может быть, int *

person Joel Bodenmann    schedule 12.06.2012
comment
в socket.h SOL_SOCKET определяется как #define SOL_SOCKET 0xffff /* параметры для уровня сокета */ - person Tinyspark; 12.06.2012
comment
Предупреждение, которое вы получаете, обычно означает, что вы не включили все необходимые заголовочные файлы должным образом. У меня нет другой идеи - извините - person Joel Bodenmann; 12.06.2012
comment
Насколько я проанализировал, cmsghdr определен только в socket.h и не присутствует ни в одном другом заголовочном файле. - person Tinyspark; 12.06.2012
comment
РЕДАКТИРОВАТЬ: вы уверены, что проблема в этой строке? - person Joel Bodenmann; 12.06.2012
comment
Привет, Tectu, я отредактировал вопрос, включив в него и предыдущую строку. CMSG_FIRSTHDR также определен в socket.h. - person Tinyspark; 12.06.2012
comment
Я не знаю CMSG или того, что вы используете, но попробуйте следующее: cmsg = *CMSG_FIRSTHDR(&msg); или cmsg = CMSG_FIRSTHDR(msg); - person Joel Bodenmann; 12.06.2012
comment
пожалуйста, узнайте разницу между ошибками и предупреждениями - ваши сообщения очень вводят в заблуждение - person Joel Bodenmann; 12.06.2012
comment
cmsg = CMSG_FIRSTHDR(msg) выдает такое же предупреждение. *CMSG_FIRSTHDR(&msg) выдает предупреждение о невозможности разыменования типа, отличного от указателя. - person Tinyspark; 12.06.2012