2012-05-12 1 views
0

아파치 웹 서버용 모듈을 구축 할 때, 구조 선언에서 const char* 멤버가 apr_table_tapr_array_header_t 선언과 같이 걸리는 경우가 발생했지만, mod_security, 심지어 새로운 ap_parse_form_data 함수는 void * 데이터 형식이 이러한 구조에 삽입되고 있음을 나타냅니다.집합 C 구조체를 재정의하는 것이 가능하다는 것을 알고 싶습니다.

제 질문은 어떻게 가능하며 왜 동일한 방법을 사용하려고하면 Visual Studio 컴파일러가 불평할까요?

이 좋은 예는 을 request_rec 메모에 저장하는 create_request 함수를 사용하는 mod_security입니다.

답변

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; 

는 따라서 그 항상 어떤 다른 개체 포인터 값을 저장할 수있는 것을 알고, void*로 포인터를 주위에 전달 만에 다시 캐스팅 C의 관례 : 그 다음은 유효 말을하는 것입니다 필요할 때 원하는 유형.

마지막으로 단어에 대한 char 특히 포인터 : char*어떤 개체 포인터를 캐스팅하고 실제로 문자의 배열에 대한 포인터로 역 참조하는 것은 하지 유형의 말장난을 구성 수행하고 엄격한 앨리어싱 규칙의 위반 아니다 - 이것은 단순히 객체의 기본 이진 표현에 액세스 할 수있게 해줍니다.

+0

그럼 내 컴파일러입니까? 컴파일러가 똑같은 코드를 사용하여 컴파일러가 불만을 나타 냈을 때 사용하고있는 함수의 정의가 허용 된 apr_table_t *, const char *, const char * 만 불평했다. 나는 윈도우에서 코드를 컴파일하려고 시도하지 않았지만, 리눅스에서는 여러 번 그렇게했다. –

+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++ 컴파일러를 사용하고 있기 때문에 그럴 수 있습니까? –