2011-11-08 5 views

답변

8

왜 안 되니?

void some_function(int user_input) 
{ 
    const int const_user_input = user_input; 
    ... 
    return; 
} 

int main (void) 
{ 
    int user_input; 
    scanf("%d", &user_input); 
    some_function(user_input); 
    return 0; 
} 
+0

고마워! 그게 정확히 내가 찾고 있던거야. – winuall

0

링커는 보통 (코드 공간 등) 읽기 전용 공간에서 글로벌 CONST를 찾아 따라서이 지역 const를

+1

항상 그렇지는 않습니다 : 로컬 변수는 const 일 수 있고 적어도 C99 및 많은 C89 변형에서 런타임 값에 의해 초기화 될 수 있습니다. –

+0

@JohanBezem OP는 범위를 언급 한 적이 없으므로 신중하지 말고 반대하는 것이 가장 좋습니다. – moshbear

+0

내 대답을 편집했습니다 –

-1

참조 의견을 나중에 변경할 수 없습니다는 const를 변수 C가 기술적으로 읽기 전용이다. 따라서 사용자 입력에서 설정할 수 없습니다.

-1

아니요, const는 컴파일 타임에 적용됩니다. 런타임에 const를 시행하려면 자체 척도를 취해야합니다. 다른 답변에 추가

0

(모두가 '아니오'라고한다), 당신은

static const int notsoconst = 3; 
scanf("%d", ((int*) &notsoconst)); 

처럼 못생긴 일을 할 수 그러나 이것은 컴파일 할 수 있지만 아마 C에서 undefined behavior을 런타임에 충돌 (이고 것 언어 사양) notsoconst은 읽기 전용 세그먼트 (적어도 Linux에서는 GCC 사용)에 저장되기 때문에.

가능하더라도 이렇게 코딩하지 않는 것이 좋습니다. 그리고 구현이 일부 읽기 전용 세그먼트에 상수를 넣지 않더라도 컴파일러는 const이 (언어 표준에 지정된대로) 절대 변경되지 않을 것이라고 예상 할 수 있으며이 가정을 사용하여 최적화 할 수 있습니다.

+2

명확히 정의되지 않은 동작입니다 (6.7.3/5). "const-qualified 형식을 사용하는 lvalue를 으로 사용하여 const-qualified 형식으로 정의 된 객체를 수정하려는 경우, 그 행동은 정해지지 않았다. ") –

5

당신은 Dadam의 대답보다 훨씬 더 직접적으로 가질 수 있습니다. (일반적으로 주석에 넣었을 것입니다 만, 직접 코드에 넣는 것이 더 쉽습니다.)

int get_user_input(void) 
{ 
    int user_input; 
    scanf("%d", &user_input); 
    return user_input; 
} 

int main(void) 
{ 
    int const user_input = get_user_input(); 
    ... 
    return 0; 
} 
관련 문제