C, C99, ANSI C 및 GNU C의 차이점은 무엇입니까?


122

저는 codechef에서 프로그래밍 연습을 시작했고 C와 C99차이로 인해 혼란 스러웠습니다 . 여기서 C는 무엇을 의미합니까? C89입니까? 이 제출 의 하단에있는 언어를 확인하십시오 . C와 C99를 모두 포함합니다.

인터넷에서 GNU C라는 것을 발견했습니다. 리눅스 / 유닉스 시스템에 다른 C가 있습니까? ANSI의 C 표준을 준수합니까? 나는 또한 몇몇 장소에서 "C99 엄격"을 읽었다. 이게 뭐야?

사용중인 다른 C 표준이 있습니까? C 4.3.2라는 것이 있습니까? 아니면 현재 사용중인 gcc 버전입니까?

편집하다:

, , 이게 도움 되었습니다. 더 많이 검색하고 답이없는 부분을 수정하겠습니다.

나는 프로그래밍 초보자가 아닙니다. 나는 C 언어가 무엇인지 압니다. C89, C99 및 C11과 같은 ANSI의 다른 C 표준이 있다는 것을 알고 있습니다.


@ 많이 검색하지 않았습니까? 나는 지금했다. 더 할게요. 질문을 더 편집하십시오.
Aseem Bansal

@Will 나는 C99 엄격한 대해와 codechef에서 C는 C89 또는 이전의 비 표준화 원래 C.인지를 찾을 수 없습니다
아심 반살

1
POSIX C를 잊지 마세요 :-)
pmg

답변:


216
  • 표준화 이전의 모든 것은 C 언어의 발명가 인 Dennis Ritchie가 저자 중 한 명으로 유명한 책을 따서 "K & R C"라고 합니다. 이것은 1972 년부터 1989 년까지의 "C 언어"였습니다.

  • 최초의 C 표준은 국가 표준 기관인 ANSI에 의해 미국에서 1989 년에 발표되었습니다. 이 릴리스를 C89 또는 ANSI-C라고합니다. 1989 년부터 1990 년까지 이것은 "C 언어"였습니다.

  • 그 후 미국 표준은 국제적으로 승인되었고 ISO (ISO 9899 : 1990)에 의해 발표되었습니다. 이 릴리스를 C90이라고합니다. 기술적으로 C89 / ANSI-C와 동일한 표준입니다. 공식적으로 C89 / ANSI-C를 대체하여 쓸모 없게되었습니다. 1990 년부터 1999 년까지 C90은 "C 언어"였습니다.

    1989 년 이후로 ANSI는 C 언어와 관련이 없습니다. 여전히 "ANSI C"에 대해 말하는 프로그래머는 일반적으로 그것이 무엇을 의미하는지에 대한 단서가 없습니다. ISO는 표준 ISO 9899를 통해 C 언어를 "소유"합니다.

  • 1995 년에 "C95"라고도하는 부 업데이트가 릴리스되었습니다. 이것은 주요 개정이 아니라 공식적으로 ISO / IEC 9899 : 1990 / Amd.1 : 1995로 명명 된 기술적 수정입니다. 주요 변경 사항은 폭 넓은 캐릭터 지원의 도입이었습니다.

  • 1999 년에 C 표준은 대대적 인 개정 (ISO 9899 : 1999)을 거쳤습니다. 이 표준 버전을 C99라고합니다. 1999 년부터 2011 년까지 이것은 "C 언어"였습니다.

  • 2011 년에 C 표준이 다시 변경되었습니다 (ISO 9899 : 2011). 이 버전을 C11이라고합니다. _Generic, _Static_assert및 스레드 지원과 같은 다양한 새로운 기능 이 언어에 추가되었습니다. 업데이트는 멀티 코어, 멀티 프로세싱 및 표현식 시퀀싱에 많은 초점을 맞추 었습니다. 2011 년부터 2017 년까지 이것은 "C 언어"였습니다.

  • 2017 년에 C11이 수정되었고 다양한 결함 보고서가 해결되었습니다. 이 표준은 비공식적으로 C17이라고하며 ISO 9899 : 2018로 발표되었습니다. 새로운 기능이없고 수정 만 포함되어 있습니다. C 언어의 현재 버전입니다.


"C99 엄격함"은 컴파일러가 문자로 표준을 따르도록 강제하는 컴파일러 설정을 나타냅니다. C 표준에는 구현준수 하는 용어가 있습니다. 본질적으로 "이 컴파일러는 실제로 C 언어를 올바르게 구현합니다"를 의미합니다. C 언어를 올바르게 구현하는 프로그램을 공식적으로 엄격히 준수하는 프로그램 이라고 합니다 .

"GNU C"는 두 가지를 의미 할 수 있습니다. GCC (GNU Compiler Collection)의 일부로 제공되는 C 컴파일러 자체입니다. 또는 GCC C 컴파일러가 사용하는 비표준 기본 설정을 의미 할 수 있습니다. 다음으로 컴파일하면gcc program.c 하면 C 표준에 따라 컴파일하지 않고 "GNU C"라고하는 비표준 GNU 설정에 따라 컴파일합니다. 예를 들어 전체 Linux 커널은 표준 C가 아닌 비표준 GNU C로 만들어집니다.

C 표준에 따라 프로그램을 컴파일하려면을 입력해야합니다 gcc -std=c99 -pedantic-errors. GCC 버전에서 지원하는 경우 c99를 c11로 바꿉니다.


8
엄격한 컴파일러 설정은 "확장 사용 안 함; 표준에 정의 된 C 언어 만 사용하십시오. 언어에 대한 확장을 허용하는 것은 완전히 정확합니다. 표준은이를 허용하도록 정의되었습니다.
Eric Postpischil 2013-06-20

5
주로 더 광범위한 캐릭터 지원을 추가 한 C94 / C95 Amendment 1도있었습니다. C 및 C ++의 표준 헤더 파일 목록을 참조하십시오 .
조나단 레플러

2
당신은 많은 것들이 C90에서 C99로 바뀌 었다고 썼습니다. 몇 가지를 말씀해 주시겠습니까?
Martin Thoma 2014 년

3
@Lundin K & R에 대한 잘못된 책을 연결했습니다. 이것은 C89 표준을 설명하는 두 번째 버전입니다.
Antti Haapala 2015

5
예,하지만 요점은 그것이 C 프로그래밍 언어를 정의한 버전이 아니라는 것입니다. 어디에서나 판매되는 것이 아닙니다.
Antti Haapala 2015

7

나는 ANSI C에 대해 응답해야한다. ANSI는 그것에 대해 아무것도하지 않았지만 컴파일러는 여전히 그것에 빌드된다. 예를 들어 PIC XC16 컴파일러 : "컴파일러는 ANSI 사양 (ANSI x3.159-1989)에 정의 된 ANSI C 표준을 준수하고 Kernighan과 Ritchie의 The C Programming Language (2 판)에 설명 된 완전히 검증 된 컴파일러입니다. ... "모든 프로그래밍이 PC와 같은"대형 "컴퓨터를위한 것은 아닙니다. 장치 비용에 대한 컴파일러를 작성하고 유효성을 검사하는 데 시간과 비용이 듭니다. ANSI C는 임베디드 / 실시간 장치에서 살아 있고 잘 살아 있습니다.


4
  • ANSI C : 최초의 C 언어는 1989 년에 ANSI라는 기관에 의해 표준화 되었기 때문에 c89라고 불립니다.

  • C99 :
    1999-2000 년에 개발자 요구 사항의 요구에 따라 추가 또는 추가 키워드 및 기능이 C99에 포함되었습니다 (예 : 인라인, 부울 .. 부동 소수점 관절 라이브러리 함수 추가).

  • GNU C : GNU는 운영 체제 (www.gnu.org)와 같은 유닉스이며 GNU의 프로젝트에는 ANSI C 표준에 기반한 C 프로그래밍 언어가 필요합니다. GNU는 GCC (GNU Compiler Collection) 컴파일러를 사용하여 코드를 컴파일합니다. malloc, calloc, exit 등의 시스템 호출을 정의하는 C 라이브러리 기능이 있습니다.

ANSI C는 다른 표준에서 사용하거나 참조하는 표준입니다.


C99 엄격한 약 및 codechef에서 C는 C89 또는 이전의 비 표준화 원래 C 여부 아무것도
아심 반살

수정 : ANSI C는 오래된 표준으로, 오래된 문서에서만 참조됩니다. C 언어를 ISO C라고합니다. 또는 ISO / IEC 9899 : 2011을 사용하는 경우.
Lundin 2013-06-20

1

Lundin 답변에 추가로

Dennis Richie가 물었을 때 말해야 할 내용입니다.

"K & R은 왜 K & R 2 판을 작성하기 전에 최종 승인 된 ANSI 표준을 기다리지 않았습니까?"

K & R은 왜 K & R 2 판을 작성하기 전에 최종 승인 된 ANSI 표준을 기다리지 않았습니까? 이 책은 최종 ANSI 표준으로 대체되기 몇 달 동안 만 올바른 표준이 될 것 같습니다. 이 말기 단계에서 큰 변화가 거의 없다는 것을 알고 있지만, 거의 즉시 3 판을 작성하거나 쓸모 없게 될 필요없이 몇 달을 기다렸다가 100 % 제대로 된 것인지 확인하는 것은 어떨까요?

초판 10 주년을 맞이하면 좋겠다고 생각했습니다. 더 진지하게, 우리는 지난 여름에 시간과 성향이 있었기 때문에 일을 시작했고 X3J11이 끝나가는 것처럼 보였습니다. 12 월과 1 월에 마무리를하면서 중요한 변화의 가능성이 배달을 연기 할 수 있는가를 고려하여 (게시자와 논의한 후) 기다릴 가치가 없다고 결정했습니다. PH는 그것을 원했고 Brian과 나는 그것을 우리 의제에서 벗어 났으면했다.

표준에 변경 사항이 있더라도 새 버전을 보증 할만큼 광범위 할 것이라고 상상하기는 어렵습니다. (우리는 noalias가 지속 되었다면 어떻게 든 대처할 준비가되어있었습니다.) 우리는 향후 인쇄에서 필요한 변경을 할 준비가되어 있지만, 그것이 사소해야한다고 바랄 이유가 있습니다. X3J11의 멤버들도 놀라운 사람없이 끝내기를 매우 열망합니다. 결국 대부분은 ANSI 컴파일러를 준비하는 회사에서 작동합니다.

데니스 리치


1
너무 나쁜 데니스 리치는해서는 안 그 컴파일러를 암시하기 위해 사용되는 방법 앨리어싱 규칙 몰랐어요 어떤 앨리어싱의 유용한 형태를 인식하는 노력을, 대신 그 코드 둔각 컴파일러에 의해 깨진 프로그래머가 컴파일러에 대한 "감사"한다고 주장 그들에게 그들의 코드가 "결함"이라는 것을 보여주는 것은 "결함이있다". 그렇지 않다면 그는 표준의 최소 요구 사항을 넘어서 앨리어싱을 지원하는 것을 거부하면 컴파일러가 어떤 목적에 부적합하게 만들 것이며, 앨리어싱에 대한 저수준 코드의 필요성은 결함이 아닙니다.
supercat

@supercat 실제로 앨리어싱 규칙이 무엇을 의미하는지 이해하지 못했습니다.
Suraj Jain

1
원래 개념은 같은 점을 감안 코드 된 int i; int test(double *p) { i=1; *p=2.0; return i; }컴파일러는 다시로드를 요구해서는 안 i에 기입 한 후 *p오프 기회에 p의 주소를 잡고 있습니다 i. 완벽하게 합리적입니다. 문제는 현대 컴파일러가에 쓰기가 있다는 가정을 정당화하기 위해 동일한 규칙을 사용한다는 것입니다 long*에 영향을 미치지 않습니다 long long, 두 가지 유형이 동일한 크기와 표현이 있더라도 , 그 두 구조는 일반적인 초기 순서를 공유하는 경우에도 코드는 결코 사용 다른 유형을 통해 작성된 CIS 멤버를 읽기위한 한 유형의 포인터.
supercat

-2

이 질문은 답변을 위해 인터넷에서 철저히 검색되지 않았습니다. 어쨌든 다음을 볼 수 있습니다.

  1. C는 1969 년부터 1973 년까지 AT & T Bell Labs에서 Dennis Ritchie가 처음 개발 한 범용 프로그래밍 언어입니다.
  2. C99는 ISO에서 발표하고 1999 년경 ANSI에서 채택한 C 언어의 표준입니다.
  3. GNU C는 c89의 확장이며 c99의 일부 기능도 추가되었지만 전체적으로 c99 표준과 다르므로 gcc에서 컴파일 할 때 -std=c99다른 답변에서 이미 언급 한 내용 을 입력해야 합니다.
  4. ANSI C는 ANSI에서 발표 한 일련의 표준입니다.

지금 인터넷에서 검색했습니다. 질문을 수정했습니다. 질문을 게시하기 전에 C 및 ANSI 표준에 대해 알고있었습니다. 특정 사항에 대해 혼란이 있습니다. 좀 더 정확하게 해보도록하겠습니다.
Aseem Bansal

C99 엄격한 약 및 codechef에서 C는 C89 또는 이전의 비 표준화 원래 C 여부 아무것도
아심 반살

4
이 답변에는 많은 오류가 있습니다. C99는 1999 년경 ISO에서 정의한 표준입니다. C 언어는 23 년 동안 국제적으로 표준화되었습니다. 따라서 ANSI는 이와 관련이 없으며 24 년 동안 C 표준을 건드리지 않았습니다. 오늘날 그들은 단순히 미국 시장을위한 ISO 표준을 인쇄하고 배포합니다.
룬딘

@Lundin 오 !! 그래, 사실 나는 "정의"라고 썼는데, 그것은 사실이 아니고 거기에서 "채택"되어야한다. 나는 수정을했다 .ANSI는 1989 년에 ISO에 의해 채택 된 최초의 C 표준을 발표했다. 그 이후 거의 모든 표준 ISO에 의해 출시되고 ANSI에 의해 채택되었으며, 대답은 요청받은 것처럼 간단합니다. 그래서 대답을 짧게 유지하는 몇 가지 사항을 언급했습니다.
0decimal0

1
참고 gcc지원 -std=c89-std=gnu89-std=c99-std=gnu99(과 현대 충분한 버전 지원 -std=c11-std=gnu11). 차이점은 표준 C에 대한 확장이 자동으로 사용 가능하거나 소스가 컴파일러가 적절한 매크로 (예 :)를 제공하도록 컴파일러를 제공 할 때만 사용하는 것입니다 -D_XOPEN_SOURCE=700.
조나단 레플러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.