2014-05-09 2 views
1

내가 C11는 더 이상 루프 구조 내에서 반복자 변수를 선언 할 수 있습니다 것으로 나타났습니다 없습니다, 예를 들면, 다음이 잘못배치가

int i; 
for (i = 0; i < 10; ++i) 

는 C99 전에 함수 (블록? Does C11 allow variable declarations at any place in a function?)의 시작 부분을 제외하고 변수를 선언도 가능하지 있다는 사실을 감안할 때,이 안전 관행에 관련이 있는지 궁금합니다. 이터레이터는 함수 또는 블록의 맨 위에 선언해야합니까? 아니면 사용되는 첫 번째 루프 바로 위에 선언해야합니까? 두 방법 모두 큰 차이가 있기 때문에 나는 볼 수 없지만, 이전 방법은 코드를 움직일 때 더욱 견고합니다. 안전에 관한 한, 나는 명백한 함의를 보지 못한다.

또한 위의 C11에서 변경된 이유는 무엇입니까? 나는 첫 번째 예제에서 구문을 좋아했다.

EDIT : 마지막 질문에 반복기를 여러 번 사용하는 경우 블록 내에서 for (int i = 0; ...을 움직이면 리팩터링하기가 쉽지 않다고하는 한 가지 문제가 있다고 생각합니다.

+2

당신은'gcc -std = c11'을 사용하고 있습니까? 'gcc' 만 사용하고 표준을 지정하지 않으면 for 루프 내부에서 선언을 허용하지 않는 기본값 인'gnu89'가 기본값으로 사용됩니다. ANSI C, C89에서 그런 식 이었지만 "혼합 된 선언과 코드"와 함께 제한이 제거되었습니다. –

+0

나는 그 옵션을 사용하지 않았습니다. – bbarker

+0

stdbool.h를 사용할 수 있기 때문에 적어도 c99를 사용한다고 가정했습니다. – bbarker

답변

6

: 좋은 소식은 그래서 당신은 괄호의 추가 세트 내부를 포장하여 C99에 대한 루프 범위를 에뮬레이션 할 수 있습니다뿐만 아니라 함수의 상단에, anywere 새로운 블록을 넣을 수 있다는 것입니다 이 아이디어를 얻었습니까?

C11 draft은 섹션 6.8.5 (1), 말한다 : 마지막 형태가 매우 명확 선언은 여전히 ​​for 문장의 첫 번째 절에서 허용되는 수

iteration-statement:

while (expression) statement

dostatementwhile (expression) ;

for (expressionopt ; expressionopt ; expressionopt) statement

for (declarationexpressionopt ; expressionopt) statement

있다.

[업데이트] 선언int i = 0 ; 같은 것을

참고. 즉, 세미콜론 (6.7 절 참조)이 포함됩니다. 따라서 for (int i = 0 ; i < 10 ; ++i)은 C11에서 확실히 허용됩니다.

[업데이트 2 즉 주관적이다 사용하는 경우에 관해서

. 필자가 생각할 때마다 선언문을 포함시켜야한다. 왜냐하면 코드를 읽기 쉽게하기 때문이다.

것은 내가 코드를 읽고 그리고 난 표시되는 경우

for (int i = 0 ; i < 10 ; ++i) 
... 

이 범위에 더 이상 있기 때문에 ... 그때, 루프가 종료 후 i의 값에 의존하지 않는 모른다.

내가 볼 경우

int i; 
for (i = 0 ; i < 10 ; ++i) 
... 

... 그럼 내가 나중에 i의 값을 사용할 것으로 예상; 예 : 어쩌면 당신은 break 일찍 알고 있었고 그 때 일어난 일은 i이었습니다. 내가 나중에 i을 사용하는 것을 보지 못한다면, 나는 아마도 당신이 생각하고있는 것이 었는지 그리고 내가 무엇을 놓치고 있는지 궁금해 할 것입니다.

일반적으로 가독성이 가장 중요한 척도입니다. 물론, "읽을 수있는"것으로 간주되는 것은 의견의 문제입니다.

+0

바닐라 gcc 명령 (버전 4.8.1)를 사용하면 "루프 초기 선언은 C99 모드에서만 허용됩니다"라는 오류 메시지가 나타납니다. – bbarker

+1

GCC와 MSVC에서 하루 종일 작동합니다. 하지만 조심해야 할 경고가 있습니다. i의 범위는 for {} 루프 내부에만 있습니다. 언제나 그렇듯이, 어떤 양식을 사용할지는 어느 정도의 판단이 필요합니다. – RocketRoy

+1

@bbarker : gcc에게 컴파일 할 C 방언을 항상 알려주십시오. [이 질문을 참조하십시오] (http://stackoverflow.com/questions/5060799/c99-not-default-c-version-for-gcc) – hugomg

2

당신이 링크 한 질문에 따르면, C11은 여전히 ​​for 루프 내에서 변수를 선언 할 수 있어야합니다 (어쨌든 왜 그런 식으로 하위 호환성을 나눕니까?).

어떤 경우에도 C89 (Microsoft 컴파일러에서 지원하는 C 표준)를 컴파일하는 경우 블록 시작 부분에 새 변수 만 선언 할 수 있습니다 (예 : 중괄호 바로 뒤).

/* ... */ 
{int i; for(i=0; i<10; i++){ 
    /* ... */ 
}} 
/* ... */ 
관련 문제