나는 이라는 문자열을 (파스칼 문자열에 대한 윙크)이라고하는 유형의 문자열을 가지고 있습니다. 구조체 {size, p_bytes}
대신 크기가 메모리에서 바이트 배열로 접두어로 붙습니다. (이유는 개념적으로나 실제적으로 이중 참조를 피하고 구조체와 바이트 배열의 이중 힙 할당을 피하는 것입니다.) 나는 더 많은 것을 sizeof(size_t)
바이트를 더 할당하는 도구 func을 사용하여 수행 할 수 있습니다. 실제 포인터를 리턴합니다 바이트 배열의 주소이며 몇 바이트 전에 크기를 읽는 매크로를 제공합니다. 그들은 풀에 억류되어 있기 때문에가리 키거나 가리 키지 않음
typedef struct {
size_t size;
uint hash;
char bytes[];
} PString;
// constructor:
PString * pstring (char * bytes, size_t size) {...}
(그 pstrings는 해시를 가지고 :
대신 나는 유연한 배열 구성원를 사용하여 "유연한 구조체"와 약간 높은 수준에서 그렇게하고 싶어 .)하지만 이제 나는 pstring에 대한 올바른 액세스를 선택하기위한 일종의 형이상학 적 문제를 가지고 있습니다. 문제는 pstrings (일반 문자열과 마찬가지로)이 포인터를 통해서만 조작된다는 사실입니다. 하지만 인터페이스를 어떻게 제공해야합니까?- 문자열이 가장 일반적으로 가 묵시적으로 지적, 유형 등
const char * string;
에, 그래서 그것은 또한 "포인트"유형의 pstring, 모두가이 포인터 타입을 알고 자연 보인다. 구조체를 사용하는 경우 - 그러나, 일반적인 관행 대신 명시 적으로
*
와 바르 선언 (때로는 예를 들어 'P_'로 이름을 접두사), (뾰족한 유형을함으로써) 하지 묵시적 소수점 변수에 (내 생각)입니다 .
그래서 여기서는 어떻게해야합니까? 그렇다면 pstrings의 사용자는 의미를 분명히 알 수 있으며 연습을 쉽게 할 수 있습니까?
어떤 경우에도 var가 지정되고 필드 액세스는 ->
입니다. 보시다시피 두 번째 옵션을 선택했습니다. 사람들은 pstring을 PString * ps;
으로 선언합니다. 하지만 다음 인수에 따라 변화 할 준비가 :
- pstring var에 간단하게 (일반 문자열보다 작은 구조체 복사에 의해 우리가 바이트를 잃고 있기 때문에 -> 인사는 segfault) unpointed 수 없습니다.
- "pstring"의 'p'는 "뾰족한"알림을 처리 할 수 있습니다.
어떻게 생각하십니까?
좋아요, 테오도 로스, 제이와 동의 하듯이 저는 지금 그대로 typedef를 유지할 것입니다. 여기에서는 pstring이 일반 C 문자열과 달리 기본 바이트에 직접 액세스하지 못하기 때문에 중요한 차이점이 있다는 사실을 "지적"하는 것이 좋습니다. 그렇습니다, 나는 pstring을 다루는 몇 가지 함수를 제공 할 것이지만, 궁극적으로는 dyn manguage의 유형이 될 것이므로 최소값 만 제공 할 것입니다. C++ String을 참조 해 주셔서 대단히 감사합니다 (모르지만 실제로 도움이 될 수 있습니다). –
추신 : 사용자가'ps-> bytes'를 통해 바이트에 접근 할 수 있기 때문에'c_str' 함수 (또는 매크로)가 정말로 유용하다고 생각합니까? –
@ denis63, c_str을 제공할지 여부는 PString을 사용하여 수행 할 추상화 정도에 따라 다릅니다. 완전히 새로운 유형으로 만들려면 c_str을 제공하고, 그렇지 않으면 사람들은 ps-> bytes를 사용하여 직접 액세스 할 수있게하십시오. 그러나 c_str을 제공하면 미래에 내부 멤버를 사용하는 코드를 방해하지 않고 바이트 등의 내부 멤버를 수정할 수 있습니다. – Jay