문제

그만큼 ANSI C에 관한 Wikipedia 기사 말한다:

ANSI C 표준화 프로세스의 목표 중 하나는 이후 도입된 많은 비공식 기능을 통합하여 K&R C(최초 공개 표준)의 상위 집합을 생성하는 것이었습니다.그러나 표준 위원회에는 함수 프로토타입(C++ 프로그래밍 언어에서 차용) 및 더욱 강력한 전처리기와 같은 몇 가지 새로운 기능도 포함되었습니다.매개변수 선언 구문도 C++ 스타일을 반영하도록 변경되었습니다.

그러다보니 차이점이 있다는 생각이 들더군요.그런데 K&R C와 ANSI C의 비교는 보지 못했습니다.그런 문서가 있나요?그렇지 않다면 주요 차이점은 무엇입니까?

편집하다:나는 K&R 책 표지에 "ANSI C"라고 적혀 있다고 생각합니다.적어도 나는 집에 있는 버전이 그렇다고 믿습니다.그렇다면 더 이상 차이가 없을 수도 있겠죠?

도움이 되었습니까?

해결책

여기서 "K&R C"가 무엇인지에 대해 약간의 혼란이 있을 수 있습니다.이 용어는 "The C 프로그래밍 언어"의 첫 번째 판에 문서화 된 언어를 나타냅니다. 대략 말하기 :1978년경 Bell Labs C 컴파일러의 입력 언어.

Kernighan과 Ritchie는 ANSI 표준화 과정에 참여했습니다."ANSI C" 방언은 "K&R C"를 대체하고 "C 프로그래밍 언어"의 후속 버전은 ANSI 규칙을 채택합니다."K&R C"는 일부 컴파일러가 여전히 레거시 코드를 허용하는 경우를 제외하면 "죽은 언어"입니다.

다른 팁

K&R C와 C89 사이에서 가장 눈에 띄는 변화는 함수 프로토타입이었지만 그 외에도 많은 변화가 있었습니다.C 라이브러리 표준화에도 많은 중요한 작업이 이루어졌습니다.표준 C 라이브러리는 기존 관행을 코드화한 것이지만, 다수의 기존 관행으로 인해 더 어려워졌습니다.P.J.플라우저의 책, 표준 C 라이브러리, 는 훌륭한 참고 자료이며, 또한 도서관은 결국 그렇게 되었습니다.

ANSI/ISO 표준 C는 대부분의 면에서 K&R C와 매우 유사합니다.대부분의 기존 C 코드는 많은 변경 없이 ANSI 컴파일러를 기반으로 구축되어야 합니다.그러나 결정적으로, 표준 이전 시대에는 언어의 의미가 각 컴파일러 공급업체에 의해 해석될 수 있었습니다.ANSI C는 모든 컴파일러를 동등한 위치에 두는 언어 의미론에 대한 공통 설명을 가져왔습니다.20여년이 지난 지금은 이것을 당연한 것으로 여기기 쉽지만 이는 상당한 성과였습니다.

대부분의 경우, 유지 관리할 사전 표준 C 코드베이스가 없다면 걱정할 필요가 없어 다행입니다.만약 그렇게 한다면, 또는 더 나쁘게도 오래된 프로그램을 보다 현대적인 표준으로 끌어올리려고 한다면 나는 동정심을 가지고 있습니다.

약간의 차이가 있지만 K&R의 이후 버전은 ANSI C용이므로 더 이상 실질적인 차이는 없습니다.
더 나은 용어가 없기 때문에 "C Classic"은 기능을 정의하는 방법이 약간 다릅니다.

int f( p, q, r )  
int p, float q, double r;  
{  
    // Code goes here  
}

다른 차이점은 기능 프로토타입이라고 생각합니다.프로토타입은 인수나 유형의 목록을 취할 필요가 없었습니다. 사실 그럴 수도 없었습니다.ANSI C에서는 그렇습니다.

  1. 함수 프로토타입.
  2. 상수 및 휘발성 한정자.
  3. 광범위한 문자 지원 및 국제화.
  4. 역참조 없이 함수 포인터를 사용할 수 있도록 허용합니다.

또 다른 차이점은 함수 반환 유형과 매개변수 유형을 정의할 필요가 없다는 것입니다.그들은 int로 간주됩니다.

f(x)
{
    return x + 1;
}

그리고

int f(x)
int x;
{
    return x + 1;
}

동일합니다.

  • 함수 프로토타입: ANSI C는 함수 정의 및 선언에 함수 이름, 인수 t, 데이터 유형 및 반환 값 데이터 유형이 포함되는 C++ 함수 프로토타입 기술을 채택합니다. 함수 프로토타입을 사용하면 ANSI c컴파일러가 잘못된 개수의 인수를 전달하는 사용자 프로그램의 함수 호출을 확인할 수 있습니다. 또는 호환되지 않는 인수 데이터 유형. 이는 K&R C 컴파일러의 주요 약점을 수정합니다. 사용자 프로그램의 잘못된 호출은 종종 컴파일을 통과하지만 실행될 때 프로그램이 충돌하게 만듭니다.

차이점은 다음과 같습니다.

  1. 원기
  2. 폭넓은 문자 지원 및 국제화
  3. const 및 휘발성 키워드 지원
  4. 함수 포인터가 역참조로 사용되도록 허용

ANSI C와 K&R C의 주요 차이점은 다음과 같습니다.

  • 함수 프로토타이핑
  • const 및 휘발성 데이터 유형 한정자 지원
  • 다양한 문자 및 국제화 지원
  • 역참조 없이 함수 포인터를 사용할 수 있도록 허용

ANSI C는 함수 정의 및 선언에 함수 이름, 인수의 데이터 유형 및 반환 값 데이터 유형이 포함되는 C++ 함수 프로토타입 기술을 채택합니다.함수 프로토타입을 사용하면 ANSI C 컴파일러가 잘못된 수의 인수 또는 호환되지 않는 인수 데이터 유형을 전달하는 사용자 프로그램의 함수 호출을 확인할 수 있습니다.이는 K&R C 컴파일러의 주요 약점을 수정합니다.

예:foo 함수를 선언하고 foo가 두 개의 인수를 취하도록 요구합니다.

 unsigned long foo (char* fmt, double data)
 {
      /*body of foo */
 }

내 생각에 가장 큰 차이점은 함수 프로토타이핑과 함수 인수 유형을 설명하는 구문입니다.

아직 아무도 언급하지 않은 주요 차이점은 ANSI 이전에는 C가 사양보다는 선례에 의해 주로 정의되었다는 것입니다.특정 작업이 일부 플랫폼에서는 예측 가능한 결과를 가져오지만 다른 플랫폼에서는 그렇지 않은 경우(예:관련되지 않은 두 포인터에 관계 연산자를 사용하는 경우), 프로그래머가 플랫폼을 보장받을 수 있도록 하는 것이 훨씬 더 선호되는 선례입니다.예를 들어:

  1. 모든 개체에 대한 모든 포인터 간의 자연스러운 순위를 정의하는 플랫폼에서는 임의의 포인터에 대한 관계 연산자를 적용하여 해당 순위를 산출할 수 있습니다.

  2. 하나의 포인터가 다른 포인터보다 "큰"지 여부를 테스트하는 자연스러운 방법이 참 또는 거짓 값을 산출하는 것 외에는 부작용이 없는 플랫폼에서 마찬가지로 임의의 포인터에 관계 연산자를 적용하면 어떤 측면도 갖지 않을 수 있습니다. -참 또는 거짓 값을 산출하는 것 이외의 효과.

  3. 두 개 이상의 정수 유형이 동일한 크기와 표현을 공유하는 플랫폼에서는 이러한 정수 유형에 대한 포인터를 사용하여 동일한 표현을 사용하는 다른 유형의 정보를 읽거나 쓸 수 있습니다.

  4. 정수 오버플로가 자연스럽게 자동으로 래핑되는 2의 보수 플랫폼에서 "int"보다 작은 부호 없는 값을 포함하는 연산은 결과가 INT_MAX+1u와 UINT_MAX 사이인 경우 값이 부호 없는 것처럼 동작하도록 의존할 수 있습니다. 더 큰 유형으로 승격되지 않았으며 왼쪽 피연산자로 사용되지도 않았습니다. >>, 피연산자 중 하나도 아닙니다. /, %, 또는 비교 연산자. 덧붙여서, 표준의 이론적 근거는 이를 작은 unsigned 유형이 signed 유형으로 승격시키는 이유 중 하나로 제시합니다..

C89 이전에는 위의 가정이 자연스럽게 유지되지 않는 플랫폼용 컴파일러가 이러한 가정을 유지할 것으로 예상되는 길이가 어느 정도인지 불분명했지만, 그러한 가정을 쉽고 저렴하게 유지할 수 있는 플랫폼용 컴파일러에는 의심의 여지가 거의 없었습니다. 그렇게 해야 합니다.C89 표준의 작성자는 다음과 같은 이유로 명시적으로 언급하지 않았습니다.

  1. 작성자가 고의적으로 둔감하지 않은 컴파일러는 실제로 들을 필요 없이 이러한 작업을 계속할 것입니다(작은 부호 없는 값을 부호 있는 값으로 승격시키는 이유는 이러한 견해를 강력하게 뒷받침합니다).

  2. 표준에서는 스택 오버플로 없이 하나의 인위적인 프로그램을 실행할 수 있는 구현만 요구했으며 둔감한 구현은 정의되지 않은 동작을 호출하는 다른 프로그램을 처리할 수 있지만 둔한 컴파일러 작성자가 작성하는 것에 대해 걱정할 가치가 없다고 생각했습니다. "적합"했지만 쓸모없는 구현.

"C89"는 동시에 "C89에 의해 정의된 언어와 플랫폼이 제공하는 추가 기능 및 보증"을 의미하는 것으로 해석되었지만 gcc 작성자는 C89에서 요구하는 것 이상의 기능과 보증을 배제하는 해석을 추진해 왔습니다.

K&R에 대한 모든 주장에도 불구하고, 낮은 곳에서부터 높은 곳의 하드웨어에 이르기까지 모든 종류의 기능을 제공할 수 있었습니다.이제 문제는 K&R C의 수백만 라인을 엉망으로 만들지 않고도 깔끔한 컴파일을 제공할 수 있는 컴파일러(가능한 무료)를 찾는 것입니다. 그리고 AMD 멀티 코어 프로세서와 같은 것에서 실행됩니다.

내가 볼 수 있는 한, GCC 4.x.x 시리즈의 소스를 살펴본 결과 내가 준비한 것보다 더 많은 노력을 들이지 않고도 -traditional 및 -cpp-traditional 지연 기능을 이전 작업 상태로 다시 활성화할 수 있는 간단한 해킹은 없습니다. 넣다.그리고 처음부터 K&R 사전 ANSI 컴파일러를 구축하는 것이 더 간단합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top