2011-12-21 1 views
6

내가 가지고있는, 더 많거나 적은 (이것은 32 비트 및 64 비트 리눅스에 MSVC2k10와 GCC가 대상을 의미) 일부 '휴대용'코드를 쓰고 있어요 :전역 형 식 연산자 오버로드?

typedef unsigned char uint8; 

C-문자열은 항상 UINT8 있습니다 ; 이것은 문자열 처리를위한 것입니다. 레거시 코드는 signed로 컴파일 된 char이 필요합니다. 따라서 컴파일러 스위치를 기본값으로 설정하여 서명되지 않도록 설정할 수는 없습니다. 하지만 인덱스를하지 아주 잘 배열 내가 할 수있는 문자열을 처리하고있어 경우 :

char foo[500]; 
char *ptr = (foo + 4); 
*ptr = some_array_that_normalizes_it[*ptr]; 

을 할 수 있습니다하지 인덱스 심각한 결과없이 실행시 음수로 배열. C- 문자열을 부호없는 상태로 유지하면 버그를 쉽게 방지 할 수 있습니다.

char *를 사용하는 함수를 사용할 때마다 캐스팅 (char *)을 유지할 필요가 없으며 클래스 함수를 복제하여 중지 할 수도 있습니다.

char foo[500] = "Hello!"; // Works 
uint8 foo2[500] = "Hello!"; // Works 
uint32 len = strlen(foo); // Works 
uint32 len2 = strlen(foo2); // Doesn't work 
uint32 len3 = strlen((char *)foo2); // Works 

아마이주의하는 이러한 성격의 암시 적 형식 변환을 허용하기 : 문자열 상수는 암시 적으로 *

int foo = strlen("Hello"); // "Hello" is passed as a char * 

나는 일이 모두를 원하는 문자로 전달되기 때문에 특히 고통 그러나 매번 캐스팅하지 않고 char *를 취하는 함수를 사용하는 것이 좋습니다.

그래서,이 같은 작업 것이라고 생각 :

operator char* (const uint8* foo) { return (char *)foo; } 

그것을하지 않는 그러나. 나는 그것이 작동하도록하는 어떤 방법을 찾아 낼 수 없다. 왜 이렇게 할 방법이없는 것일 지 말해 줄 수있는 것도 없습니다. 가능한 로직을 볼 수 있습니다 - 암시 적 변환은 FAR의 원인이 될 수있는 버그가 너무 많습니다. - 그러나 "C++에서 작동하지 않습니다"또는 그 이유나 작동 방법을 알려주는 항목을 찾을 수 없습니다. uin8은 어리 석다.)

+3

적어도 하나의 사용자 정의 형식을 포함하지 않는 캐스트 (또는 연산자)를 쓸 수 없습니다. –

+0

'signed char'을 사용하는 레거시 코드가 있습니까 ?? 나는 매우 의심 스럽습니다 ... –

+2

uint8을 어리석게 만드는 이유는 무엇입니까? 길잃은 글로벌 캐스팅 기능을 가지고있는 것보다 더 이상한 일은 아닙니다. – ThomasMcLeod

답변

1

저는 운영자 [ab]를 사용하는 팬이 아니지만, C++이 옳은가요? 정의 된와

const char* operator+(const uint8* foo) 
{ 
    return (const char *)foo; 
} 

char* operator+(uint8* foo) 
{ 
    return (char *)foo; 
} 

, 귀하의 예를 위에서 :

uint32 len2 = strlen(foo2); 

그것은 자동 캐스트하지

uint32 len2 = strlen(+foo2); 

될 것입니다,하지만

당신은 다음과 같은 작업을 수행 할 수 이렇게하면 쉽고 명확한 방법으로 할 수 있습니다.

+0

고마워, 좋은 생각이야! –

+0

와우 ............ –

0

언급 한 두 컴파일러에는 "처리되지 않은 문자로 처리"스위치가 있습니다. 왜 그것을 사용하지 않습니까?

+0

기존 코드 위반. 마치 두 번째 문장에서 말했듯이. –

+0

아 ... 그럼 프로그램의 성격에 대해 잘 모르겠습니다. 나는 네가 새로운 것을 쓰고 있다고 생각 했어! (첫 번째 문장에서 말한 것처럼) –

3

글로벌 캐스트 (배역) 연산자 글로벌 할당 연산자 글로벌 배열 첨자 연산자 및 전역 함수 호출 연산자 오버로딩은 는 C++에서 허용되지 않는다.

MSVS C++에서 C2801 errors을 생성합니다. Look at wiki C++ 연산자 목록 및 해당 규칙 오버로드.