malloc qnx работает неожиданным образом

Я написал программу, которую скомпилировал и запустил под Linux. Он работал правильно. Затем я был вынужден портировать его на QNX.

Я это сделал, и когда я попытался скомпилировать его там (qnx с моментикой), я получил загадочную ошибку:

timer_t * timer = malloc(sizeof(timer_t)); <---- invalid conversion from 'void*' to 'timer_t*'

здесь я получаю еще одну ошибку (я думаю) подобного типа:

static void signalor(int sig, siginfo_t *si, void *uc)
    timer_t *tidptr;
    tidptr = si->si_value.sival_ptr;<----- invalid conversion from 'void*' to 'timer_t*'

Кто-нибудь знает, почему я получаю эту ошибку? Или как это исправить?

заранее спасибо.


person Jenia Ivanov    schedule 20.10.2013    source источник
comment
Похоже, вы используете компилятор C++ для компиляции кода C. Неявное приведение типа void* недопустимо для C++, но допустимо для C.   -  person rici    schedule 20.10.2013


Ответы (2)


Кредиты принадлежат @rici, поскольку он ответил много лет назад, но для того, чтобы перейти к закрытию, следующий код решает проблему:

#include <malloc.h>
#include <time.h>
#include <signal.h>

int main() {
    timer_t * timer = (timer_t*)malloc(sizeof(timer_t));

    siginfo_t si = {0};
    timer_t *tidptr;

    tidptr = (timer_t*)si.si_value.sival_ptr;

    return 0;
}

bash-3.2$ ntoarmv7-g++ tst.c -Wall
tst.c: In function 'int main()':
tst.c:7: warning: unused variable 'timer'
bash-3.2$

Проблема объяснена как компилятором, так и ричи выше: С++ не позволяет назначать указатели несовместимого типа. Исходный код будет успешно собираться с помощью gcc (вместо g++).

person maverick    schedule 03.12.2013

Спасибо Филипу Кендаллу за то, что поправил меня. :-)

Похоже, вы забыли #include <stdlib.h>.

Без этого компилятор считает, что malloc() возвращает int, что явно не того же типа как timer_t *.

person kmort    schedule 20.11.2013
comment
Если это действительно C, вы не должны этого делать. - person Philip Kendall; 20.11.2013
comment
Смотрите связанный вопрос :-) - person Philip Kendall; 20.11.2013
comment
@PhilipKendall О боже. Я чувствую себя застенчивым. Исправил ответ. Спасибо за вашу помощь. - person kmort; 20.11.2013
comment
Я так не думаю: сообщение об ошибке, которое получает исходный постер, - это недопустимое преобразование из void*, поэтому компилятор, очевидно, знает, что это void*. Я подозреваю, что @rici прав, и на самом деле это компилируется как C++. - person Philip Kendall; 20.11.2013
comment
@PhilipKendall В этом случае следует отметить одну вещь о QNX: они используют прописные буквы QCC для предварительной обработки C ++ и строчные буквы qcc для предварительной обработки C. Не уверен, что произойдет после этого, но каким-то образом он определяет, какие библиотеки использовать, основываясь на входном случае вызова компилятора. В любом случае, если OP использует хост с учетом регистра для создания этого, они могут легко случайно использовать QCC вместо qcc. Вы можете использовать qcc -V для указания компилятора. qnx.com/developers/docs/6.3. 2/neutrino/utilities/q/qcc.html - person kmort; 20.11.2013