2010-03-21 3 views
1

함수를 가리키는 포인터가 있습니다.C : 문 안에서 if 문을 선언 할 수 없습니다.

if (mode == 0) 
    { 
    const unsigned char *packet = read_serial_packet(src, &len); 

    } else { 
    const unsigned char *packet = read_network_packet(fd, &len); 
    } 

코드에서 나중에 포인터를 처음 사용할 때 불편을 둡니다.하지만 컴파일러가 불평하기 때문에이를 수행 할 수 없습니다.

error: 'packet' undeclared (first use in this function) 

이것은 이상합니다. if 문 없이도 작동했지만 지금은 다른 소스에서 데이터를 가져올 수있는 프로그램이 필요합니다. 이것을 할 수 있습니까? 나도 그렇게 생각해. 그렇지 않다면 내가 시도하고있는 것을 얻을 수있는 다른 간단한 방법이 있습니까?

고마워요.

+1

한 가지 방법 즉'unsigned char const * packet'은 "const unsigned char에 대한 포인터"로 읽혀집니다. 'unsigned char * const packet'은 "unsigned char에 대한 상수 포인터"로 읽혀집니다. 라인을 거꾸로 읽으면 어떤 유형의 포인터인지 쉽게 기억할 수 있습니다. –

+2

또한 함수에 대한 포인터가 없다는 점에 유의해야합니다. 함수의 반환 값을 저장하는 데 사용되는 문자 포인터가 있습니다. –

+0

저는 C에서 이런 종류의 저수준 포인터를 관리하는 데별로 숙련되어 있지 않습니다. 그래서 나는 더 나은 C 프로그래머가 될 수 있도록 조언을 담당합니다. 감사. –

답변

17

, 또는 가변 범위.

복합 문 ({, })에 변수를 선언하면 해당 범위에서만 변수가 선언됩니다. 문 절은 if 문의 끝에 그것을 스코프 경우

따라서,

const unsigned char *packet = NULL; 
if (mode == 0) 
{ 
    packet = read_serial_packet(src, &len); 
} else { 
    packet = read_network_packet(fd, &len); 
} 

// Now you can perform operations on packet. 
+0

그래서 컴파일러가 선언되지 않은 패킷에 대해 불평하는 이유가 여기에 있습니다. 코드가 완벽하게 작동했습니다. 고마워. –

2

변수를 if 문 안에 선언 한 다음 나중에 사용하면 프로그램을 통해 일부 경로에 존재하지 않는 메모리 위치가 될 수 있습니다.

편집 : 더 일찍 선언하십시오.

7

블록에 선언 된 변수는 외부에서 볼 수 없습니다.

if (mode == 0) 
    { 
    const unsigned char *packet = read_serial_packet(src, &len); 
    // packet can be used here 
    } else { 
    const unsigned char *packet = read_network_packet(fd, &len); 
    // packet can be used here 
    } 

    // packet can not be used here 

당신은 당신의 상태에 따라 if 전에 packet을 선언하고 ifelse에 할당해야합니다

당신은 블록 또는 화합물 문의 개념을 검토해야
const unsigned char *packet; 

if (mode == 0) 
{ 
    packet = read_serial_packet(src, &len); 
} 
else 
{ 
    packet = read_network_packet(fd, &len); 
} 

// packet can be used here 
+0

'const'는 적절한 사용법에서 여전히 괜찮습니다. – Potatoswatter

+0

@Potatoswatter : 네 말이 맞아. 추가 된 –

1

에 내부 포인터의 선언 코드를 변경합니다. if 문 밖에서 포인터를 선언하고 내부에서 할당해야합니다.

2

변수를 정의 할 때 정의 된 범위 내에서만 변수를 사용할 수 있습니다.

{ 
    const unsigned char *packet; 

    { 
     packet = read_serial_packet(src, &len); 

    } 

    // packet still in scope here 

} 

// and packet is no longer in scope here 
2

이 같은 경우 문 앞에 포인터를 선언 :

{ 
    const unsigned char *packet = read_serial_packet(src, &len); 

    // packet goes out of scope when the block ends 
} 

그래서 당신은 당신이 필요로하는 가장 큰 범위로 정의를 이동해야

const unsigned char *packet; 
if (mode == 0) { 
    packet = read_serial_packet(src, &len); 

} else { 
    packet = read_network_packet(fd, &len); 
} 
3

이것은 중괄호 { }을하기 때문에 새로운 범위를 만드십시오. 즉,이 중괄호 사이에 정의 된 모든 변수는 범위 내에서 정의되므로 바깥 쪽에서는 볼 수 없습니다.경우에도이 아닌 구조에 대해 같은 동안, 또는 경우,

const unsigned char *packet = 0; 
if (mode == 0) 
{ 
    packet = read_serial_packet(src, &len); 
} 
else { 
    packet = read_network_packet(fd, &len); 
} 
+1

패킷 안의 문자 (포인터 뒤)는 변경되지 않습니다. 포인터는 언제든지 바뀔 수 있습니다. – Potatoswatter

+0

@ Potatoswatter의 의견을 두 번째로 :이 예제에서'unsigned char const'에 대한 포인터를 여전히 선언 할 수 있습니다. –

+0

@Potatoswatter, @PP 감사합니다. 물론 당신이 옳습니다. – pajton

9

괄호 어떤 종류의 범위를 벗어나 넣어 것

는 경우 - 다른 전에 *packet를 정의 할 필요가 작동하게합니다.

또한

{ 
    int num = 2; 
} 
num++; // error: out of scope! 

즉, 당신은 할 수 그것은 단지 원 : const` 변수 이름 근처에 배치하는 것입니다`의 목적에 대해 있지만 올바른에 분명히 존재의

const unsigned char *packet = (mode == 0) ? read_serial_packet(src, &len) : read_network_packet(fd, &len); 
+0

mnemosyn이 대답 했으므로, 선언문이 범위를 벗어났습니다. 나는 그것을 모릅니다. –