2012-05-12 1 views
0

При создании модуля для веб-сервера Apache я столкнулся с несколькими примерами, когда декларация структуры говорит, что она принимает только const char* членов, как в объявлении apr_table_t и apr_array_header_t, но примеры, которые я нахожу в различных модулях, таких как mod_security, и даже новая функция ap_parse_form_data указывает, что в эти структуры вставлен тип данных void *.Я хотел бы понять, насколько возможно переопределение набора C struct?

Мои вопросы: как это возможно и почему мой компилятор Visual Studio жалуется, если я попытаюсь использовать тот же метод?

Хорошим примером этого является mod_security с функцией create_request, которая хранит void * в примечании request_rec.

ответ

1

Указатели конвертируемые, и каждый объект типа указателя конвертируемые в void*, в том смысле, что хранение какой-либо указатель в void* не теряет информацию. То есть, справедливо следующее:

struct Foo a; 
struct Foo * p = &a; // p points to a 

void * q = p;   // OK, can store the value of p in q 

struct Foo * r = q; // OK too - we can go back, and r points to a 

r->n = 1; 

Таким образом, обычно в C проходить вокруг указателей в void*, зная, что те всегда может держать любой другое значение указателя объекта, и только бросить его обратно желаемый тип при необходимости.

Одно последнее слово о char указателей в частности: Кастинг любой указатель на объект в char* и фактически разыменования его как указатель на массив символов делает не составляют тип каламбурная и не является нарушением строгих правил наложения спектров - это просто позволяет вам получить доступ к базовому двоичному представлению любого объекта.

+0

Это мой компилятор тогда? Когда я пытался использовать один и тот же точный код для выяснения процесса, компилятор с горечью жаловался, что определение функции, которую я использовал, было принято только apr_table_t *, const char *, const char *. Я не пытался компилировать код в Windows, но делал это в Linux много раз. –

+0

@AlexErwin: Можете ли вы опубликовать некоторый фактический код вместе с ошибкой, которую вы испытываете? –

+0

Я не уверен, как это сделать здесь, потому что код изобилует. Однако фрагмент структуры apr_table_t 'struct apr_table_entry_t { char * key; char * val; apr_uint32_t key_checksum; }; 'Я не в состоянии продублировать ошибку прямо сейчас, но когда я выполняю эту функцию' APR_DECLARE (void) apr_table_set (apr_table_t * t, const char * key, const char * val); 'с переменная, напечатанная как void *, компилятор перестает говорить и говорит, что я не могу этого сделать. Может быть, это потому, что я использую компилятор C++? –