본문으로 이동

C++

위키백과, 우리 모두의 백과사전.
C++ 프로그래밍 언어는 여기로 연결됩니다. 책에 대해서는 C++ 프로그래밍 언어 (책) 문서를 참고하십시오.
C++
C++ 표준 위원회가 승인한 로고
패러다임다중 패러다임: 절차적, 명령형, 함수형, 객체 지향, 제네릭, 모듈형
계열C
설계자비야네 스트롭스트룹
개발자ISO/IEC JTC 1 (Joint Technical Committee 1) / SC 22 (Subcommittee 22) / WG 21 (Working Group 21)
발표일1985년(41년 전)(1985)
최근 버전C++23 (ISO/IEC 14882:2024)
최근 버전 출시일2024년 10월 19일(17개월 전)(2024-10-19)
미리보기 버전C++26
미리보기 버전 출시일2025년 8월 5일(7개월 전)(2025-08-05)
자료형 체계정적, 강함, 명목적, 부분적 추론
운영 체제크로스 플랫폼
파일 확장자.C, .cc, .cpp, .cxx, .c++, .h, .H, .hh, .hpp, .hxx, .h++ .cppm, .ixx[1]
웹사이트isocpp.org
주요 구현체
GCC, LLVM Clang, 마이크로소프트 비주얼 C++, 엠바카데로 C++빌더, 인텔 C++ 컴파일러, IBM XL C++, EDG
영향을 받은 언어
에이다, 알골 68,[2] BCPL,[3] C, CLU,[2] F#,[4][a] ML, Mesa,[2] 모듈라-2,[2] 시뮬라, 스몰토크[2]
영향을 준 언어
에이다 95, C#,[5] C99, Carbon, Chapel,[6] 클로저,[7] D, 자바,[8] JS++,[9] 루아,[10] Nim,[11] Objective-C++, Perl, PHP, 파이썬,[12] 러스트[13]

C++[b]는 덴마크의 컴퓨터 과학자 비야네 스트롭스트룹이 만든 고급 프로그래밍 언어이자 범용 프로그래밍 언어이다. 1985년 객체 지향 프로그래밍(OOP) 기능을 추가한 C 프로그래밍 언어의 확장으로 처음 출시되었으며, 이후 더 많은 OOP 및 기타 기능을 추가하며 크게 발전해 왔다. 1997년/C++98 표준화 이후 C++는 마이크로컴퓨터와 같은 시스템이나 리눅스 또는 윈도우와 같은 운영체제 제작을 위한 저급 프로그래밍 언어 수준의 메모리 조작 기능에 더해 함수형 프로그래밍 기능을 추가했으며, 나중에는 (템플릿 사용을 통한) 제네릭 프로그래밍과 같은 기능도 도입되었다. C++는 대개 컴파일 언어로 구현되며, 자유 소프트웨어 재단, LLVM, 마이크로소프트, 인텔, 엠바카데로, 오라클, IBM 등 많은 벤더가 C++ 컴파일러를 제공한다.[14]

C++는 시스템 프로그래밍임베디드, 자원 제약이 있는 소프트웨어 및 대규모 시스템을 염두에 두고 설계되었으며, 성능, 효율성 및 사용의 유연성이 설계의 핵심이다.[15] C++는 소프트웨어 인프라 및 자원 제약이 있는 애플리케이션에서 강점을 보이며 다른 많은 분야에서도 유용하게 사용된다.[15] 여기에는 데스크톱 애플리케이션, 비디오 게임 개발, 서버(예: 전자 상거래, 웹 검색 엔진, 데이터베이스), 그리고 성능이 중요한 애플리케이션(예: 전화 교환기우주 탐사선)이 포함된다.[16]

C++는 국제 표준화 기구(ISO)에 의해 표준화되었으며, 최신 표준 버전은 2024년 10월 ISO/IEC 14882:2024(비공식적으로 C++23)로 승인 및 발표되었다.[17] C++ 프로그래밍 언어는 1998년에 ISO/IEC 14882:1998로 처음 표준화되었으며, 이후 C++03, C++11, C++14, C++17, C++20 표준에 의해 개정되었다. 현재의 C++23 표준은 새로운 기능과 확장된 C++ 표준 라이브러리로 이전 표준들을 대체한다. 1998년 첫 표준화 이전에는 비야네 스트롭스트룹이 1979년부터 벨 연구소에서 C 언어의 확장으로 C++를 개발했다. 그는 프로그램 구성을 위한 고급 기능을 제공하면서도 C와 유사하게 효율적이고 유연한 언어를 원했다.[18] 2012년부터 C++는 3년 주기의 릴리스 일정을 따르고 있으며,[19] 다음 표준으로는 C++26이 계획되어 있다.[20]

역사

[편집]
2000년경 뉴저지 AT&T 사무실에 있는 C++의 창시자 비야네 스트롭스트룹

1979년, 덴마크의 컴퓨터 과학자 비야네 스트롭스트룹은 C++의 전신인 "클래스를 포함한 C"에 관한 연구를 시작했다.[21] 새로운 언어를 만들게 된 동기는 스트롭스트룹이 박사 학위 논문을 위해 프로그래밍을 했던 경험에서 비롯되었다. 스트롭스트룹은 시뮬라가 대규모 소프트웨어 개발에 매우 유용한 기능들을 가졌지만 실제 사용하기에는 너무 느리다는 점을 발견했고, 반면 BCPL은 빠르지만 대규모 소프트웨어 개발에 적합하지 않을 정도로 너무 저급 언어라는 점을 발견했다. 스트롭스트룹이 AT&T 벨 연구소에서 일하기 시작했을 때, 그는 분산 컴퓨팅과 관련하여 유닉스 커널을 분석하는 문제에 직면했다. 박사 과정 시절의 경험을 떠올린 스트롭스트룹은 C 언어에 시뮬라와 같은 기능을 추가하여 강화하기로 결정했다.[22] C는 범용적이고 빠르며 이식성이 높고 널리 사용되었기 때문에 선택되었다. C와 시뮬라의 영향 외에도 알골 68, 에이다, CLU, ML 등의 다른 언어들도 이 새로운 언어에 영향을 주었다.[23]

처음에 스트롭스트룹의 "클래스를 포함한 C"는 C 컴파일러인 Cpre에 클래스, 파생 클래스, 강한 타이핑, 인라이닝, 디폴트 인수 등의 기능을 추가했다.[24]

2015년 파리에서 진행 중인 C++11 기능에 대한 퀴즈

1982년, 스트롭스트룹은 여러 이름을 거쳐 "C++"라고 이름 붙인 "클래스를 포함한 C"의 후속 언어를 개발하기 시작했다(++는 C의 증감 연산자이다). 가상 함수, 함수 및 연산자 오버로딩, 참조, 상수, 타입 안전한 자유 저장소 메모리 할당(new/delete), 개선된 타입 체크, 그리고 두 개의 슬래시(//)를 사용하는 BCPL 스타일의 한 줄 주석 등의 새로운 기능이 추가되었다. 또한 스트롭스트룹은 C++를 위한 새로운 독립형 컴파일러인 Cfront를 개발했다.

1984년, 스트롭스트룹은 최초의 스트림 입출력 라이브러리를 구현했다. 이름이 붙은 출력 함수 대신 출력 연산자를 제공하자는 아이디어는 더글러스 매킬로이에 의해 제안되었다[2] (그는 이전에 유닉스 파이프를 제안한 바 있다).

1985년, C++ 프로그래밍 언어의 초판이 출간되었는데, 당시에는 아직 공식 표준이 없었기에 이 책은 언어의 결정적인 참고 자료가 되었다.[25] 같은 해 10월, C++의 첫 번째 상용 구현체가 출시되었다.[21]

1989년에는 C++ 2.0이 출시되었고, 이어 1991년에는 C++ 프로그래밍 언어의 개정된 2판이 출간되었다.[26] 2.0의 새로운 기능에는 다중 상속, 추상 클래스, 정적 멤버 함수, 상수 멤버 함수, 보호된 멤버(protected members)가 포함되었다. 1990년에는 Annotated C++ Reference Manual이 출간되어 미래 표준의 기초가 되었다. 이후 추가된 기능으로는 템플릿, 예외 처리, 이름공간, 새로운 캐스트, 불리언 자료형 등이 있다.

1998년 C++98이 출시되어 언어가 표준화되었으며, 2003년에는 마이너 업데이트인 C++03이 출시되었다.

C++98 이후 C++는 비교적 천천히 발전하다가, 2011년에 C++11 표준이 발표되면서 수많은 새로운 기능이 추가되고 표준 라이브러리가 더욱 확장되었으며 C++ 프로그래머들에게 더 많은 편의를 제공하게 되었다. 2014년 12월에 발표된 마이너 업데이트인 C++14 이후, C++17에서 다양한 새로운 기능들이 도입되었다.[27] 2020년 2월에 마무리된 후,[28] C++20 표준 초안이 2020년 9월 4일에 승인되었고, 2020년 12월 15일에 공식적으로 발표되었다.[29][30]

2018년 1월 3일, 스트롭스트룹은 "C++ 프로그래밍 언어를 구상하고 개발한 공로"로 2018년 공학계의 노벨상이라 불리는 찰스 스타크 드레이퍼상 수상자로 발표되었다.[31]

2022년 12월, C++는 TIOBE 지수에서 지수 역사상 처음으로 자바를 제치고 3위를 차지했다. 2024년 11월 기준, C++는 파이썬에 이어 2위를 기록하고 있으며 자바는 3위이다.[32]

2025년 3월, 스트롭스트룹은 언어 커뮤니티에 C++를 방어해 달라는 요청을 보냈다. C++는 수동 메모리 관리를 허용하기 때문에 프로그래머가 실수로 잘못 사용할 경우 버퍼 오버플로와 같이 보안 위험을 초래하는 버그가 프로그램에 유입될 수 있기 때문이다.[33]

어원

[편집]

스트롭스트룹에 따르면, "이 이름은 C로부터의 변화가 진화적 성격을 띠고 있음을 의미한다."[34] 이 이름은 릭 마시티(Rick Mascitti, 1983년 중반)가 지은 것으로 알려져 있으며[24] 1983년 12월에 처음 사용되었다. 1992년 마시티는 명명 이유에 대해 비공식적인 질문을 받았을 때, 익살스러운 기분으로 지은 것이라고 답했다. 이 이름은 변수증가시키는 C의 ++ 연산자와, 강화된 컴퓨터 프로그램을 나타내기 위해 "+"를 사용하는 일반적인 명명 규칙에서 유래했다.

개발 기간 동안 C++는 최종 이름을 얻기 전까지 "새로운 C"(new C)나 "클래스를 포함한 C"로 불리기도 했다.[24][35]

철학

[편집]

C++가 존재해 온 기간 동안 그 개발과 진화는 일련의 원칙들에 의해 가이드되어 왔다.[22]

  • 실제 문제에 의해 주도되어야 하며 그 기능들은 실제 세계의 프로그램에서 즉각적으로 유용해야 한다.
  • 모든 기능은 구현 가능해야 한다 (상당히 명확한 방법으로).
  • 프로그래머는 자신만의 프로그래밍 스타일을 자유롭게 선택할 수 있어야 하며, C++는 그 스타일을 완전히 지원해야 한다.
  • 유용한 기능을 허용하는 것이 발생 가능한 모든 오용을 방지하는 것보다 더 중요하다.
  • 프로그램을 별도의 잘 정의된 부분으로 조직하는 기능을 제공해야 하며, 별도로 개발된 부분을 결합하는 기능을 제공해야 한다.
  • 자료형 체계의 암시적 위반이 없어야 한다 (하지만 프로그래머가 명시적으로 요청한 경우에는 명시적 위반을 허용한다).
  • 사용자 정의 타입은 내장 타입과 동일한 지원과 성능을 가져야 한다.
  • 사용되지 않는 기능은 생성된 실행 파일에 부정적인 영향을 미쳐서는 안 된다 (예: 성능 저하).
  • C++ 아래에 다른 언어가 있어서는 안 된다 (어셈블리어 제외).
  • C++는 자신만의 별도의 호환되지 않는 프로그래밍 환경을 조성하기보다는 기존의 다른 프로그래밍 언어들과 함께 작동해야 한다.
  • 프로그래머의 의도가 불분명하다면, 수동 제어를 제공하여 프로그래머가 이를 명시할 수 있게 한다.

표준화

[편집]
C++ 표준
연도 ISO/IEC 표준 비공식 명칭
1998 14882:1998[36]C++98
2003 14882:2003[37]C++03
2011 14882:2011[38]C++11, C++0x
2014 14882:2014[39]C++14, C++1y
2017 14882:2017[40]C++17, C++1z
2020 14882:2020[41]C++20, C++2a
2024 14882:2024[17]C++23, C++2b
발표 예정 C++26, C++2c

C++는 JTC1/SC22/WG21로 알려진 ISO 작업 그룹에 의해 표준화된다. 이 작업 그룹은 매년 3회의 일주일짜리 회의를 개최한다.[42] 지금까지 일곱 번의 C++ 표준 개정판을 발표했으며 현재 다음 개정판인 C++26을 작업 중이다.

1996년 스톡홀름에서 열린 C++ 표준 위원회 회의 장면

1998년, ISO 작업 그룹은 C++를 ISO/IEC 14882:1998로 처음 표준화했으며, 이는 비공식적으로 C++98로 알려져 있다. 2003년에는 C++98에서 발견된 문제들을 수정한 ISO/IEC 14882:2003이라는 새로운 버전의 C++ 표준을 발표했다.

다음 주요 개정판은 비공식적으로 "C++0x"로 불렸으나, 2011년이 되어서야 발표되었다.[43] C++11 (14882:2011)은 핵심 언어와 표준 라이브러리 모두에 많은 추가 사항을 포함했다.[38]

2014년에는 C++11의 소규모 확장판으로 주로 버그 수정과 작은 개선을 특징으로 하는 C++14 (C++1y로도 알려짐)가 발표되었다.[44] 국제 표준 초안(Draft International Standard) 투표 절차는 2014년 8월 중순에 완료되었다.[45]

C++14 이후, 비공식적으로 C++1z로 알려진 주요 개정판 C++17은 2017년 7월 중순 ISO C++ 위원회에 의해 완성되었으며, 2017년 12월에 승인 및 발표되었다.[46]

표준화 과정의 일환으로 ISO는 기술 보고서 및 사양도 발행한다:

  • ISO/IEC TR 18015:2006:[47] 임베디드 시스템에서의 C++ 사용과 C++ 언어 및 라이브러리 기능의 성능 영향에 관한 보고서.
  • ISO/IEC TR 19768:2007:[48] (C++ 기술 보고서 1로도 알려짐) 대부분 C++11에 통합된 라이브러리 확장 사항.
  • ISO/IEC TR 29124:2010:[49] 특수 수학 함수에 관한 보고서로, C++17에 통합됨.
  • ISO/IEC TR 24733:2011:[50] 십진 부동소수점 산술에 관한 보고서.
  • ISO/IEC TS 18822:2015:[51] 표준 파일 시스템 라이브러리에 관한 사양으로, C++17에 통합됨.
  • ISO/IEC TS 19570:2015:[52] 표준 라이브러리 알고리즘의 병렬 버전에 관한 사양으로, C++17에 통합됨.
  • ISO/IEC TS 19841:2015:[53] 소프트웨어 트랜잭셔널 메모리에 관한 사양.
  • ISO/IEC TS 19568:2015:[54] 새로운 라이브러리 확장 세트로, 일부는 이미 C++17에 통합됨.
  • ISO/IEC TS 19217:2015:[55] C++ 콘셉트에 관한 사양으로, C++20에 통합됨.
  • ISO/IEC TS 19571:2016:[56] 동시성을 위한 라이브러리 확장 사항으로, 일부는 이미 C++20에 통합됨.
  • ISO/IEC TS 19568:2017:[57] 새로운 범용 라이브러리 확장 세트.
  • ISO/IEC TS 21425:2017:[58] 범위를 위한 라이브러리 확장 사항으로, C++20에 통합됨.
  • ISO/IEC TS 22277:2017:[59] 코루틴에 관한 사양으로, C++20에 통합됨.
  • ISO/IEC TS 19216:2018:[60] 네트워킹 라이브러리에 관한 사양.
  • ISO/IEC TS 21544:2018:[61] 모듈에 관한 사양으로, C++20에 통합됨.
  • ISO/IEC TS 19570:2018:[62] 병렬성을 위한 새로운 라이브러리 확장 세트.
  • ISO/IEC TS 23619:2021:[63] 리플렉티브 프로그래밍(리플렉션)을 위한 새로운 확장 사항.
  • ISO/IEC TS 9922:2024:[64] 새로운 동시성 확장 세트.
  • ISO/IEC TS 19568:2024:[65] 또 다른 새로운 라이브러리 확장 세트.

더 많은 기술 사양들이 현재 개발 중이거나 승인을 기다리고 있다.

언어

[편집]

C++ 언어에는 두 가지 주요 구성 요소가 있다. 주로 C 서브셋에 의해 제공되는 하드웨어 기능의 직접적인 매핑과, 그러한 매핑을 기반으로 한 오버헤드 없는 추상화이다. 스트롭스트룹은 C++를 "효율적이고 우아한 추상화를 구축하고 사용하기 위해 [설계된] 가벼운 추상화 프로그래밍 언어"라고 설명하며,[15] "하드웨어 접근과 추상화를 모두 제공하는 것이 C++의 기초이다. 이를 효율적으로 수행하는 것이 다른 언어들과 차별화되는 점이다"라고 말한다.[66]

C++는 C 문법의 대부분을 상속한다. C 표준을 준수하는 hello world 프로그램은 유효한 C++ hello world 프로그램이기도 하다. 다음은 C++ 표준 라이브러리의 스트림 기능을 사용하여 표준 출력에 메시지를 쓰는 Hello world 프로그램의 비야네 스트롭스트룹 버전이다.[67][68][c]

#include <iostream>

int main() {
    std::cout << "Hello, world!\n";
}

C++23부터는 std::print 함수와 모듈 std의 도입으로 다음과 같이 더 간결하게 표현할 수 있다.

import std;

int main() {
    std::println("Hello, world!");
}

표준 라이브러리

[편집]
C++98로 승인된 "Working Paper" 표준 초안. 그 절반은 C++ 표준 라이브러리에 할당되었다.

C++ 표준은 핵심 언어와 표준 라이브러리의 두 부분으로 구성된다. C++ 프로그래머는 모든 주요 C++ 구현체에서 표준 라이브러리를 사용할 수 있기를 기대한다. 여기에는 집계 타입(벡터, 연결 리스트, 맵(예: 트리 맵해시 맵), 셋(예: 트리 셋해시 셋), , 스택, 배열, 튜플), 알고리즘(find, for_each, binary_search, random_shuffle 등), 입출력 시설(입출력 스트림, 콘솔 및 파일 읽기/쓰기), 파일 시스템 조작, 지역화 지원, 자동 메모리 관리를 위한 스마트 포인터, 정규 표현식 지원, 멀티스레딩 라이브러리, 원자성(atomics) 지원(외부 동기화 없이 한 번에 최대 하나의 스레드에서 변수를 읽거나 쓸 수 있게 함), 시간 유틸리티(측정, 현재 시간 가져오기 등), C++ 예외 처리를 사용하지 않는 오류 보고를 C++ 예외로 변환하는 시스템, 난수 생성기, 그리고 C++ 타입 시스템을 준수하도록 약간 수정된 C 표준 라이브러리 버전이 포함된다.

C++ 표준 라이브러리의 설계는 C 표준 라이브러리와 마찬가지로 미니멀리즘을 추구하며 프로그래밍을 위한 핵심 기능만을 포함한다. 자바 표준 라이브러리C# 표준 라이브러리에서 제공하는 보다 전문적인 기능은 대부분 갖추고 있지 않다. 더 많은 기능이 필요한 경우, 표준 라이브러리를 보완하기 위해 추가 기능을 제공하는 Boost 라이브러리POCO C++ 라이브러리와 같은 타사 라이브러리를 사용할 수 있다.

C++ 라이브러리의 큰 부분은 표준 템플릿 라이브러리(STL)를 기반으로 한다. STL이 제공하는 유용한 도구에는 객체 컬렉션인 컨테이너(예: 벡터연결 리스트), 컨테이너에 배열과 유사하게 접근할 수 있게 하는 반복자, 그리고 검색 및 정렬과 같은 작업을 수행하는 알고리즘이 포함된다.

또한, 호환 가능한 인터페이스를 제공하는 (멀티)맵(연관 배열)과 (멀티)셋이 제공된다. 따라서 템플릿을 사용하면 어떠한 컨테이너나 반복자에 의해 정의된 어떠한 시퀀스에 대해서도 작동하는 제네릭 알고리즘을 작성할 수 있다.

C에서와 마찬가지로, 라이브러리기능#include 지시문을 사용하여 표준 헤더를 포함함으로써 접근할 수 있다. C++ 표준 라이브러리는 105개의 표준 헤더를 제공하며, 그중 27개는 권장되지 않는다(deprecated). C++20에서 모듈이 도입됨에 따라 이러한 헤더들은 import로 접근할 수 있게 되었으며, C++23에서는 import std;를 통해 표준 라이브러리 전체를 모듈로서 직접 임포트할 수 있다. 현재 C++ 표준 라이브러리는 stdstd.compat(C 표준 라이브러리 기능을 전역 이름공간으로 내보내는 std 호환 모듈) 두 가지 모듈을 제공한다.

표준 라이브러리는 수년 동안 제네릭 알고리즘과 컨테이너를 실험해 온 알렉산더 스테파노프가 원래 설계한 STL을 통합하고 있다. 그가 C++를 시작했을 때, 그는 마침내 인라이닝과 함수 포인터 대신 컴파일 타임 바인딩을 사용하는 것과 같은 C++의 기능 덕분에 C 표준 라이브러리의 qsort보다 더 나은 성능을 내는 제네릭 알고리즘(예: STL sort)을 만들 수 있는 언어를 발견했다. 표준에서는 이를 표준 라이브러리의 일부일 뿐이기에 "STL"이라고 부르지 않지만, 이 용어는 표준 라이브러리의 나머지 부분(입출력 스트림, 국제화, 진단, C 라이브러리 서브셋 등)과 구별하기 위해 여전히 널리 사용된다.[69]

대부분의 C++ 컴파일러와 모든 주요 컴파일러는 C++ 표준 라이브러리의 표준 준수 구현체를 제공한다.

C++ Core Guidelines

[편집]

C++ Core Guidelines[70]는 C++의 창시자 비야네 스트롭스트룹과 C++ ISO 작업 그룹의 의장이자 소집자인 허브 서터(Herb Sutter)가 주도하는 프로젝트이다. 이는 프로그래머들이 C++11 이상의 언어 표준에 대한 모범 사례를 사용하여 '모던 C++'를 작성하도록 돕고, 컴파일러 및 정적 분석 도구 개발자들이 잘못된 프로그래밍 습관을 잡아내는 규칙을 만들 수 있도록 돕는 것을 목표로 한다.

주요 목적은 타입 및 자원 안전성이 보장된 C++를 효율적이고 일관되게 작성하는 것이다.

Core Guidelines는 CPPCon 2015의 기조 연설에서 발표되었다.[71]

지침과 함께 GSL(Guideline Support Library)이 제공되는데,[72] 이는 지침을 구현하기 위한 타입과 함수들로 구성된 헤더 전용 라이브러리이며 지침 규칙을 강제하기 위한 정적 분석 도구와 함께 사용된다.[73]

호환성

[편집]

컴파일러 벤더들에게 더 큰 자유를 주기 위해 C++ 표준 위원회는 네임 맹글링, 예외 처리 및 기타 구현 관련 기능의 구현 방식을 강제하지 않기로 결정했다. 이 결정의 단점은 서로 다른 컴파일러에 의해 생성된 목적 파일이 서로 호환되지 않을 수 있다는 것이다. 그러나 특정 시스템이나 운영체제를 위한 컴파일러 표준화 시도들이 있다. 예를 들어, Itanium C++ ABI는 (그 이름에도 불구하고) 프로세서 독립적이며 GCC와 Clang에 의해 구현되었다.[74]

C와의 호환성

[편집]

C++는 종종 C의 상위 집합으로 간주되지만 이것이 엄밀히 사실인 것은 아니다.[75] 대부분의 C 코드는 C++에서 올바르게 컴파일되도록 쉽게 수정될 수 있지만, 유효한 C 코드가 C++에서 유효하지 않거나 다르게 동작하게 만드는 몇 가지 차이점이 있다. 예를 들어, C는 void*에서 다른 포인터 타입으로의 암시적 변환을 허용하지만 C++는 (타입 안전성 문제로) 이를 허용하지 않는다. 또한 C++는 newclass와 같은 많은 새로운 키워드를 정의하는데, 이들은 C 프로그램에서 식별자(예: 변수 이름)로 사용될 수 있다.

어떤 호환성 문제들은 1999년 개정된 C 표준(C99)에서 해결되었는데, 현재 C99는 한 줄 주석(//)이나 코드와 섞인 선언 등 C++ 기능을 지원한다. 반면에 C99는 C++에서 지원하지 않거나 C++에서 중복되거나 호환되지 않는 여러 새로운 기능들을 도입했다. 여기에는 가변길이배열, 네이티브 복소수 타입(C++ 표준 라이브러리의 std::complex 클래스가 유사한 기능을 제공하지만 코드 호환성은 없음), 지정된 초기화(designated initializers), 복합 리터럴, 그리고 restrict 키워드가 포함된다.[76] C99에서 도입된 일부 기능들은 이후 버전인 C++11에 포함되었다(중복되지 않는 기능 위주).[77][78][79] 하지만 C++11 표준은 문자열 리터럴을 문자 포인터에 할당하는 것을 금지하는 것과 같은(C에서는 여전히 유효함) 새로운 호환성 문제를 도입하기도 했다.

C와 C++ 코드를 혼용하려면, C와 C++ 양쪽에서 호출되거나 사용될 모든 함수 선언이나 정의를 extern "C" {/*...*/} 블록 안에 두어 C 링키지(linkage)로 선언해야 한다. 그러한 함수는 네임 맹글링에 의존하는 기능(예: 함수 오버로딩)을 사용할 수 없다.

인라인 어셈블리

[편집]

C 또는 C++로 개발된 프로그램은 성능 최적화가 필수적일 때, 고급 프로그래밍 언어에 비해 저급 기능, 더 빠른 속도, 강화된 제어력을 활용하기 위해 인라인 어셈블리를 사용하기도 한다.[80][81] C++는 asm 선언을 사용하여 어셈블리어를 내장하는 것을 지원하지만,[82] 인라인 어셈블리의 호환성은 컴파일러와 아키텍처에 따라 크게 달라진다. 파이썬이나 자바와 같은 고급 언어 기능과 달리 어셈블리 코드는 기본 프로세서와 컴파일러 구현에 크게 의존한다.

컴파일러별 차이점

[편집]

다양한 C++ 컴파일러는 인라인 어셈블리를 서로 다른 방식으로 구현한다.

  • GCC (GNU 컴파일러 모음) 및 Clang:[83] GCC 확장 인라인 어셈블리 문법을 사용한다. -ansi-std 옵션으로 컴파일할 수 있는 코드를 작성할 때는 asm 대신 __asm__ 키워드를 사용하여 입력/출력 피연산자와 클로버드(clobbered) 레지스터를 지정할 수 있다. 이 방식은 인텔[84]IBM[85] 컴파일러 등에서 널리 채택하고 있다.
  • MSVC (마이크로소프트 비주얼 C++): 인라인 어셈블러가 컴파일러에 내장되어 있다. 이전에는 __asm 키워드를 통한 인라인 어셈블리를 지원했으나, 64비트 모드에서는 이 지원이 제거되어 대신 별도의 .asm 모듈이 필요하다.[86]
  • TI ARM Clang 및 임베디드 컴파일러:[87] 텍사스 인스트루먼트의 TI Arm Clang과 같은 일부 임베디드 시스템 컴파일러는 인라인 어셈블리를 허용하지만, 레지스터 규약 및 호출 규약과의 충돌을 피하기 위해 더 엄격한 규칙을 적용한다.

C++와 어셈블리 간의 상호운용성

[편집]

C++는 ASM 코드를 통합하는 두 가지 기본 방법을 제공한다.

1. 독립 실행형 어셈블리 파일 – 어셈블리 코드를 별도로 작성하고 C++ 코드와 연결한다.[88]

2. 인라인 어셈블리 – 컴파일러 전용 확장 기능을 사용하여 C++ 코드 내에 어셈블리 코드를 내장한다.

같이 보기

[편집]

각주

[편집]
  1. Overview of modules in C++. Microsoft. 2023년 4월 24일.
  2. 1 2 3 4 5 6 Stroustrup, Bjarne (1996). A history of C++: 1979-1991. History of programming languages---II. ACM. 699–769쪽. doi:10.1145/234286.1057836.
  3. Stroustrup, Bjarne (2021년 12월 16일). C++20: Reaching for the Aims of C++ - Bjarne Stroustrup - CppCon 2021. CppCon. 2021년 12월 30일에 원본 문서에서 보존된 문서. 2021년 12월 30일에 확인함.
  4. Stroustrup, Bjarne (2020년 6월 12일). Thriving in a crowded and changing world: C++ 2006–2020. Proceedings of the ACM on Programming Languages 4 (Association for Computing Machinery (ACM)). 1–168쪽. doi:10.1145/3386320. ISSN 2475-1421. S2CID 219603741.
  5. Naugler, David (May 2007). C# 2.0 for C++ and Java programmer: conference workshop. Journal of Computing Sciences in Colleges 22. Although C# has been strongly influenced by Java it has also been strongly influenced by C++ and is best viewed as a descendant of both C++ and Java.
  6. Chapel spec (Acknowledgements) (PDF). Cray Inc. 2015년 10월 1일. 2018년 6월 24일에 원본 문서 (PDF)에서 보존된 문서. 2016년 1월 14일에 확인함.
  7. Fogus, Michael. Rich Hickey Q&A. Code Quarterly. 2017년 1월 11일에 원본 문서에서 보존된 문서. 2017년 1월 11일에 확인함.
  8. Harry. H. Chaudhary (2014년 7월 28일). Cracking The Java Programming Interview :: 2000+ Java Interview Que/Ans. 2021년 5월 27일에 원본 문서에서 보존된 문서. 2016년 5월 29일에 확인함.
  9. Roger Poon (2017년 5월 1일). Scaling JS++: Abstraction, Performance, and Readability. 2020년 5월 11일에 원본 문서에서 보존된 문서. 2020년 4월 21일에 확인함.
  10. The evolution of an extension language: a history of Lua. www.lua.org. 2023년 1월 4일에 확인함.
  11. FAQ Nim Programming Language. 2017년 7월 11일에 원본 문서에서 보존된 문서. 2020년 4월 21일에 확인함.
  12. 9. Classes — Python 3.6.4 documentation. docs.python.org. 2012년 10월 23일에 원본 문서에서 보존된 문서. 2018년 1월 9일에 확인함.
  13. Influences - The Rust Reference. doc.rust-lang.org. 2023년 1월 4일에 확인함.
  14. Stroustrup, Bjarne (1997). 1 Thi판. The C++ Programming Language. Addison-Wesley. ISBN 0-201-88954-4. OCLC 59193992.
  15. 1 2 3 Stroustrup, B. (2014년 5월 6일). Lecture:The essence of C++. University of Edinburgh.. YouTube. 2015년 4월 28일에 원본 문서에서 보존된 문서. 2015년 6월 12일에 확인함.
  16. Stroustrup, Bjarne (2014년 2월 17일). C++ Applications. stroustrup.com. 2021년 4월 4일에 원본 문서에서 보존된 문서. 2014년 5월 5일에 확인함.
  17. 1 2 ISO/IEC 14882:2024. International Organization for Standardization. 2020년 10월 21일에 확인함.
  18. Bjarne Stroustrup's Homepage. www.stroustrup.com. 2019년 5월 14일에 원본 문서에서 보존된 문서. 2013년 5월 15일에 확인함.
  19. C++ IS schedule (PDF). 2020년 8월 10일에 원본 문서 (PDF)에서 보존된 문서. 2020년 8월 9일에 확인함.
  20. C++; Where it's heading. 2018년 12월 3일에 원본 문서에서 보존된 문서. 2018년 12월 3일에 확인함.
  21. 1 2 Stroustrup, Bjarne (2010년 3월 7일). Bjarne Stroustrup's FAQ: When was C++ invented?. stroustrup.com. 2016년 2월 6일에 원본 문서에서 보존된 문서. 2010년 9월 16일에 확인함.
  22. 1 2 Stroustrup, Bjarne. Evolving a language in and for the real world: C++ 1991-2006 (PDF). 2007년 11월 20일에 원본 문서 (PDF)에서 보존된 문서. 2013년 8월 14일에 확인함.
  23. The C Family of Languages: Interview with Dennis Ritchie, Bjarne Stroustrup, and James Gosling, C++ Report, 12(7), July/August 2000, cited in The C Family of Languages: Interview with Dennis Ritchie, Bjarne Stroustrup, and James Gosling. 2025년 12월 26일에 확인함.
  24. 1 2 3 Stroustrup, Bjarne. A History of C ++ : 1979− 1991 (PDF). 2019년 2월 2일에 원본 문서 (PDF)에서 보존된 문서. 2013년 7월 18일에 확인함.
  25. Stroustrup, Bjarne. The C++ Programming Language Fir판. 2012년 8월 9일에 원본 문서에서 보존된 문서. 2010년 9월 16일에 확인함.
  26. Stroustrup, Bjarne. The C++ Programming Language Seco판. 2012년 8월 9일에 원본 문서에서 보존된 문서. 2010년 9월 16일에 확인함.
  27. Sutter, Herb (2016년 6월 30일). Trip report: Summer ISO C++ standards meeting (Oulu). herbsutter.com. 2016년 10월 8일에 원본 문서에서 보존된 문서. the next standard after C++17 will be C++20
  28. Dusíková, Hana (2019년 11월 6일). N4817: 2020 Prague Meeting Invitation and Information (PDF). 2019년 12월 29일에 원본 문서 (PDF)에서 보존된 문서. 2020년 2월 13일에 확인함.
  29. Current Status. isocpp.org. 2020년 9월 8일에 원본 문서에서 보존된 문서. 2020년 9월 7일에 확인함.
  30. C++20 Approved -- Herb Sutter. isocpp.org. 2020년 9월 11일에 원본 문서에서 보존된 문서. 2020년 9월 8일에 확인함.
  31. Computer Science Pioneer Bjarne Stroustrup to Receive the 2018 Charles Stark Draper Prize for Engineering (보도 자료). National Academy of Engineering. 2018년 1월 3일. 2018년 1월 3일에 원본 문서에서 보존된 문서. 2021년 12월 14일에 확인함.
  32. TIOBE (November 2024). TIOBE Index for November 2024. TIOBE.com. TIOBE Company. 2024년 11월 18일에 원본 문서에서 보존된 문서. 2024년 11월 18일에 확인함.
  33. Claburn, Thomas (2025년 3월 2일). C++ creator calls for help to defend programming language from 'serious attacks'. The Register. 2025년 3월 5일에 확인함.
  34. Bjarne Stroustrup's FAQ – Where did the name "C++" come from?. 2016년 2월 6일에 원본 문서에서 보존된 문서. 2008년 1월 16일에 확인함.
  35. C For C++ Programmers. 노스이스턴 대학교. 17 November 2010에 원본 문서에서 보존된 문서. 7 September 2015에 확인함.
  36. ISO/IEC 14882:1998. International Organization for Standardization. 2017년 1월 15일에 원본 문서에서 보존된 문서. 2018년 11월 23일에 확인함.
  37. ISO/IEC 14882:2003. International Organization for Standardization. 2021년 8월 13일에 원본 문서에서 보존된 문서. 2018년 11월 23일에 확인함.
  38. 1 2 ISO/IEC 14882:2011. International Organization for Standardization. 2016년 5월 27일에 원본 문서에서 보존된 문서. 2018년 11월 23일에 확인함.
  39. ISO/IEC 14882:2014. International Organization for Standardization. 2016년 4월 29일에 원본 문서에서 보존된 문서. 2018년 11월 23일에 확인함.
  40. ISO/IEC 14882:2017. International Organization for Standardization. 2013년 1월 29일에 원본 문서에서 보존된 문서. 2017년 12월 2일에 확인함.
  41. ISO/IEC 14882:2020. International Organization for Standardization. 2020년 12월 16일에 원본 문서에서 보존된 문서. 2020년 12월 16일에 확인함.
  42. Meetings and Participation. News, Status & Discussion About Standard C++. The Standard C++ Foundation. 2025년 9월 6일에 확인함.
  43. We have an international standard: C++0x is unanimously approved. Sutter's Mill. 2011년 8월 12일. 2018년 6월 28일에 원본 문서에서 보존된 문서. 2018년 11월 23일에 확인함.
  44. The Future of C++. 2018년 10월 23일에 원본 문서에서 보존된 문서. 2018년 11월 23일에 확인함 channel9.msdn.com 경유.
  45. We have C++14! : Standard C++. isocpp.org. 2014년 8월 19일에 원본 문서에서 보존된 문서. 2014년 8월 19일에 확인함.
  46. Sutter, Herb (2017년 7월 15일). Trip report: Summer ISO C++ standards meeting (Toronto). 2017년 8월 6일에 원본 문서에서 보존된 문서. 2017년 8월 4일에 확인함.
  47. ISO/IEC TR 18015:2006. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  48. ISO/IEC TR 19768:2007. International Organization for Standardization. 2016년 3월 4일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  49. ISO/IEC TR 29124:2010. International Organization for Standardization. 2019년 1월 12일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  50. ISO/IEC TR 24733:2011. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  51. ISO/IEC TS 18822:2015. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  52. ISO/IEC TS 19570:2015. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  53. ISO/IEC TS 19841:2015. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  54. ISO/IEC TS 19568:2015. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  55. ISO/IEC TS 19217:2015. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  56. ISO/IEC TS 19571:2016. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  57. ISO/IEC TS 19568:2017. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  58. ISO/IEC TS 21425:2017. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  59. ISO/IEC TS 22277:2017. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  60. ISO/IEC TS 19216:2018. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  61. ISO/IEC TS 21544:2018. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  62. ISO/IEC TS 19570:2018. International Organization for Standardization. 2019년 1월 15일에 원본 문서에서 보존된 문서. 2019년 2월 15일에 확인함.
  63. ISO/IEC TS 23619:2021. International Organization for Standardization. 2018년 12월 15일에 원본 문서에서 보존된 문서. 2021년 10월 11일에 확인함.
  64. ISO/IEC TS 9922:2024. International Organization for Standardization. 2025년 4월 1일에 원본 문서에서 보존된 문서. 2025년 4월 1일에 확인함.
  65. ISO/IEC TS 19568:2024. International Organization for Standardization. 2025년 2월 25일에 원본 문서에서 보존된 문서. 2025년 4월 1일에 확인함.
  66. B. Stroustrup (interviewed by Sergio De Simone) (2015년 4월 30일). Stroustrup: Thoughts on C++17 - An Interview. 2015년 7월 8일에 원본 문서에서 보존된 문서. 2015년 7월 8일에 확인함.
  67. Stroustrup, Bjarne (2000). The C++ Programming Language Special판. Addison-Wesley. 46쪽. ISBN 0-201-70073-5.
  68. Stroustrup, Bjarne. Open issues for The C++ Programming Language (3rd Edition). 2014년 5월 5일에 원본 문서에서 보존된 문서. 2014년 5월 5일에 확인함.
  69. Graziano Lo Russo (2008). An Interview with A. Stepanov. stlport.org. 2009년 3월 4일에 원본 문서에서 보존된 문서. 2015년 10월 8일에 확인함.
  70. C++ Core Guidelines. isocpp.github.io. 2020년 2월 16일에 원본 문서에서 보존된 문서. 2020년 2월 9일에 확인함.
  71. Bjarne Stroustrup announces C++ Core Guidelines : Standard C++. isocpp.org. 2020년 5월 11일에 원본 문서에서 보존된 문서. 2020년 3월 31일에 확인함.
  72. microsoft/GSL. 2021년 7월 18일. 2021년 7월 18일에 원본 문서에서 보존된 문서. 2021년 7월 18일에 확인함 GitHub 경유.
  73. Using the C++ Core Guidelines checkers. Microsoft Learn. 2021년 8월 13일에 원본 문서에서 보존된 문서. 2020년 3월 31일에 확인함.
  74. C++ ABI Summary. 2001년 3월 20일. 2018년 7월 10일에 원본 문서에서 보존된 문서. 2006년 5월 30일에 확인함.
  75. Bjarne Stroustrup's FAQ – Is C a subset of C++?. 2016년 2월 6일에 원본 문서에서 보존된 문서. 2014년 5월 5일에 확인함.
  76. C9X – The New C Standard. 2018년 6월 21일에 원본 문서에서 보존된 문서. 2008년 12월 27일에 확인함.
  77. C++0x Support in GCC. 2010년 7월 21일에 원본 문서에서 보존된 문서. 2010년 10월 12일에 확인함.
  78. C++0x Core Language Features In VC10: The Table. 2010년 8월 21일에 원본 문서에서 보존된 문서. 2010년 10월 12일에 확인함.
  79. Clang - C++98, C++11, and C++14 Status. Clang.llvm.org. 2013년 5월 12일. 2013년 7월 4일에 원본 문서에서 보존된 문서. 2013년 6월 10일에 확인함.
  80. Bokil, Milind A. (2021). "Writing Assembly Routines within C/C++ and Java Programs". ResearchGate. Retrieved 1 April 2025.
  81. De Vilhena, Paulo Emílio; Lahav, Ori; Vafeiadis, Viktor; Raad, Azalea (2024). Extending the C/C++ Memory Model with Inline Assembly. Proceedings of the ACM on Programming Languages 8. 1081–1107쪽. arXiv:2408.17208. doi:10.1145/3689749.
  82. cppreference.com contributors. "asm declaration". cppreference.com. Retrieved 1 April 2025.
  83. Extended Asm (Using the GNU Compiler Collection). GCC Online Documentation. GNU Project. 2025년 4월 1일에 확인함.
  84. Intel Corporation. "Inline Assembly". Intel® C++ Compiler Classic Developer Guide and Reference, Version 2021.9. Retrieved 1 April 2025.
  85. IBM. "Inline assembly statements (IBM extension)". IBM Documentation. Retrieved 1 April 2025.
  86. Inline Assembler Overview. Microsoft Learn. Microsoft. 2025년 4월 1일에 확인함.
  87. Interfacing C and C++ With Assembly Language. Texas Instruments. Texas Instruments Incorporated. 2025년 2월 23일. 2025년 4월 1일에 확인함.
  88. C++ to ASM linkage in GCC. OSDev Wiki. 2025년 4월 1일에 확인함.
내용주
  1. C++20의 스택리스 코루틴 개념을 위해.
  2. /ˈs plʌs plʌs/로 발음하며, 가끔 CPP 또는 CXX로 줄여 쓴다.
  3. 이 코드는 비야네 스트롭스트룹의 정오표 페이지(633쪽)에서 발췌했다. 그는 std::endl보다는 '\n'을 사용할 것을 권장한다. 또한 main 함수에서의 암시적인 return 0;에 대한 설명은 Can I write "void main()"? 보관됨 2020-07-02 - 웨이백 머신을 참고하라. 이 암시적인 반환은 다른 함수에서는 사용할 수 없다.

외부 링크

[편집]