최근 GCC의 아주 오래된 버전 (어딘가에 버전 2.3)으로 컴파일 된 레거시 코드를 수정해야했습니다. 함수 내에서 변수는 사용되기 전에 선언되어야합니다. 나는 이것이 C89 표준이라고 생각한다. 이 제한은 나중에 제거됩니다.이전 C에서 사용하기 전에 변수 선언하기
내 질문은 : 그렇다면 왜 그들이이 판결을 집행 했습니까? 소프트웨어의 무결성을 위태롭게 할 수있는 우려가 있었습니까?
최근 GCC의 아주 오래된 버전 (어딘가에 버전 2.3)으로 컴파일 된 레거시 코드를 수정해야했습니다. 함수 내에서 변수는 사용되기 전에 선언되어야합니다. 나는 이것이 C89 표준이라고 생각한다. 이 제한은 나중에 제거됩니다.이전 C에서 사용하기 전에 변수 선언하기
내 질문은 : 그렇다면 왜 그들이이 판결을 집행 했습니까? 소프트웨어의 무결성을 위태롭게 할 수있는 우려가 있었습니까?
변수는 여전히 사용되기 전에 선언되어야하며 함수의 맨 위에 선언 될 필요가 전혀 없습니다.
블록은 열기가 {
이고 그 뒤에 0 개 이상의 선언이오고 그 뒤에 0 개 이상의 명령문이오고 그 뒤에는 닫음 }
이옵니다.
이 법적 C89 (그리고는 void
없이 1978로가는 심지어 K & RC, 또는 이전) :
int foo(void) {
int outer = 10;
{
int inner = 20;
printf("outer = %d, inner = %d\n", outer, inner);
}
printf("outer = %d, inner is not visible\n", outer);
return 0;
}
C99는 선언과 문장 내에서 혼합 될 수 있도록이 문제를 풀어 블록 : B, BCPL, 심지어 알골 : 원래 제한의 이유에 관해서는
int foo(void) {
int x = 10;
printf("x = %d\n", x);
int y = 20;
printf("y = %d\n", y);
return 0;
}
, 나는 그것이 다시 C의 조상 언어에 간다 생각합니다. 아마도 컴파일러의 작업을 좀 더 쉽게 만들었을 것입니다. (구문 분석이 쉬워 질 것이라고 생각했지만, 생각하지 않습니다. 문맥에서 미리 알지 못하고 선언이나 진술을 구별 할 수 있어야합니다.)
네,하지만 "top at declare"스타일을 선호합니다. –
@AmigableClarkKant : 사용법에 가까운 변수를 선언하고 특히 이니셜 라이저의 이전 구문을 활용할 수 있도록하기 위해 언급해야 할 것이 있습니다. –
"이니셜 라이저에서 이전 명령문을 이용할 수 있다는 것을 이해하지 못합니다." –
주로 컴파일러를 쓰기 쉽도록 만들었습니다. 모든 선언이 함수의 최상위에 있으면 컴파일러가 모든 지역을 구문 분석하고 스택이 얼마나 필요한지를 쉽게 판별 할 수 있습니다.
물론 컴파일러는 30 년 전보다 훨씬 성숙합니다. 따라서 프로그래머에게는 불편 함이 있으므로이 제한을 제거하는 것이 좋습니다.
그럼에도 불구하고, 함수의 시작 부분에 모든 변수를 선언하면 코드가 더 깨끗하고 읽기 쉽고 유지 관리가 쉽다고 생각합니다. 하지만 나는 때때로 코드를 그렇게 짜증나게 만들 수 있다고 인정한다. – Radu
첫 번째 선언문이 아닌 코드 블록의 시작 부분에 항상 새로운 변수를 추가 할 수있었습니다. 그러므로 void function (int i) {int j; {int k; ...; } ...; }'는 항상 유효했습니다 (물론 타원 대신 적절한 코드 사용). –
왜 우리가 변수를 선언하는지 묻습니다. 아니면 함수의 시작 부분에 변수가 선언 된 이유는 무엇입니까? 질문을 표현한 방식은 매우 이상합니다. –