2016-05-01 2 views
1

Для операционной системы VxWorks, они обеспечивают системную библиотеку для задач нерестовых:Почему TaskSpawn принимает ints вместо void *?

int taskSpawn 
    (
    char * name,    /* name of new task (stored at pStackBase) */ 
    int  priority,   /* priority of new task */ 
    int  options,   /* task option word */ 
    int  stackSize,  /* size (bytes) of stack needed plus name */ 
    FUNCPTR entryPt,   /* entry point of new task */ 
    int  arg1,    /* 1st of 10 req'd task args to pass to func */ 
    int  arg2, 
    int  arg3, 
    int  arg4, 
    int  arg5, 
    int  arg6, 
    int  arg7, 
    int  arg8, 
    int  arg9, 
    int  arg10 
    ) 

Вы можете увидеть, насколько ограничены это по сравнению с чем-то вроде станд :: нить.
Обычно я могу передать соответствующие аргументы на основе функции ввода.


Учитывая, что это функция C, мне было интересно, есть ли причина, по которой VxWorks предпочитает иметь аргументы 1-10 быть Интсом вместо пустых указателей.

Если бы они были указателями пустоты, я мог бы пройти любым типом, а затем отбросить его обратно в функцию ввода.

Если я хочу передать указатель struct foo в функцию ввода, заданную taskSpawn, может ли она быть преобразована в целое число, а затем обратно к соответствующему указателю?
Основываясь на дизайне этой функции, я вынужден использовать глобальные переменные?

ответ

1

Я думаю, вы обнаружите, что на VxWorks целое число того же размера, что и указатель, и обычной практикой является бросить между ними. Поэтому, если вы хотите передать указатель через TaskSpawn, вы можете передать его как (int)ptr.

Нет, это не портативный C, но, по-видимому, это обычная практика на этой платформе с этой функцией.

+0

Хмм, это звучит как довольно грязный код. Опираясь на детали реализации без необходимости, это плохой стиль. ** Iff ** нужно передать указатель как целое число (в некоторых общих функциях есть веские причины), 'intptr_t' и его sibbling' uintptr_t' следует использовать. Это не только гарантированно удерживает указатель, но также четко указывает, что «этот объект может содержать указатель». – Olaf

+0

@Olaf: Это не актуально здесь, потому что человек, задающий этот вопрос, использует API-интерфейс поставщика, который не может быть изменен. –

+0

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

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