2012-12-13 3 views
0

나는 이라는 문자열을 (파스칼 문자열에 대한 윙크)이라고하는 유형의 문자열을 가지고 있습니다. 구조체 {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'는 "뾰족한"알림을 처리 할 수 ​​있습니다.

어떻게 생각하십니까?

답변

1

내 의견으로는 두 번째 방법을 사용하는 것이 좋습니다.

암시 적으로 포인터 "C"문자열의 경우 바이트 1에서 문자열 내용에 직접 액세스 할 수있는 바이트 배열처럼 작동합니다. 그러나이 경우에는 구성된 (사용자 정의) 유형이고 그 구별을하기 위해서, 나는 그것을 명시 적 포인터 (즉 두 번째 접근법)로 선호한다.

Btw,이 문자열에서 비교, 문자 검색 등의 작업을 수행하는 기능을 제공하겠습니까? 나는 당신이 모델의 C++ String 종류를 따르고 "바이트"에 대한 포인터를 더 제공하는 c_str 함수를 제공 할 것을 제안한다.

+0

좋아요, 테오도 로스, 제이와 동의 하듯이 저는 지금 그대로 typedef를 유지할 것입니다. 여기에서는 pstring이 일반 C 문자열과 달리 기본 바이트에 직접 액세스하지 못하기 때문에 중요한 차이점이 있다는 사실을 "지적"하는 것이 좋습니다. 그렇습니다, 나는 pstring을 다루는 몇 가지 함수를 제공 할 것이지만, 궁극적으로는 dyn manguage의 유형이 될 것이므로 최소값 만 제공 할 것입니다. C++ String을 참조 해 주셔서 대단히 감사합니다 (모르지만 실제로 도움이 될 수 있습니다). –

+0

추신 : 사용자가'ps-> bytes'를 통해 바이트에 접근 할 수 있기 때문에'c_str' 함수 (또는 매크로)가 정말로 유용하다고 생각합니까? –

+0

@ denis63, c_str을 제공할지 여부는 PString을 사용하여 수행 할 추상화 정도에 따라 다릅니다. 완전히 새로운 유형으로 만들려면 c_str을 제공하고, 그렇지 않으면 사람들은 ps-> bytes를 사용하여 직접 액세스 할 수있게하십시오. 그러나 c_str을 제공하면 미래에 내부 멤버를 사용하는 코드를 방해하지 않고 바이트 등의 내부 멤버를 수정할 수 있습니다. – Jay

1

저는 유연한 배열 멤버의 팬이 아니지만, 그 접근 방법을 선택 했으므로 포인터의 속성을 볼 수있는 상태로 유지할 것입니다. 그 이유는 더 정직하고 명확한 것입니다. 그것을 사용합니다.

0

현재 옵션을 사용하여 포인터를 명시 적으로 지정하는 것이 좋습니다. 라이브러리 사용자는 어쨌든 포인터임을 알고 있어야합니다 (예 : ->을 사용하면 할당을 사용하면 얕은 사본 만 생성됨을 알고 있으므로 숨길 수있는 사항 만 혼동합니다).

표준 라이브러리는 또한이 접근법의 예를 제공합니다. FILE 유형은 항상 FILE *으로 사용해야합니다.

관련 문제