C ++ 모듈 초안 (C ++ 17 이후의 기술 사양)
WG21 은 open-std.org에 C / C ++ 모듈 사양에 대한 초안과 몇 가지 업데이트 된 개정판을 게시했습니다 . 여기에서는 최신 문서에만 연결하겠습니다.
- Working Draft, Extensions to C ++ for Modules N4610 (2016 년 10 월).
- 네 번째 개정판은 P0142R0 (2016 년 3 월) 으로 게시되었습니다 .
- P0143R2 (2016 년 3 월) 로 게시 된 모듈에 대한 문구 .
- clang 팀은 변경 사항의 두 번째 개정판 인 P0273R1 (2016 년 10 월) 을 게시했습니다 .
다음 블로그 게시물에는 표준 회의 요약과 특히 모듈 초안의 현재 상태에 대한 요약이 포함되어 있습니다.
업데이트 : 위에서 링크 한 Kona 여행 보고서에 설명 된대로 현재 두 개의 경쟁 제안이 있습니다. 하나는 Microsoft에서 제공하고 하나는 Clang에서 제공합니다. Microsoft에서 제안한 솔루션은 매크로 내보내기를 허용하지 않지만 Clang 팀의 솔루션은 매크로 내보내기를 지원합니다. 지금까지 Microsoft만이 모듈 사양에 대한 초안을 공식적으로 제출했습니다.
Microsoft에서 제안한 모듈 사양
다음은이 제안에 포함 된 가장 중요한 개념에 대한 간략한 개요입니다. 초안이므로 여전히 변경 될 수 있습니다. 새로운 모듈 표준은 무엇보다도 다음으로 구성됩니다.
module
키워드가 모듈을 선언하고, 여러 파일을 하나 개의 모듈을 구축하려면이 옵션을 선언 할 수 있습니다 (그러나 각 모듈에 대해 하나의 컴파일 단위는 포함 할 수있는 export {}
섹션) :
module M;
import
수입 모듈 키워드 대신 import
그것은 또한 사용하기로 결정 수 있습니다 using module
새로운 수입 키워드를 피할 수 있도록, 대신.
import std.io;
import module.submodule;
이 모듈의 일부인 export
공용 선언 을 정의 하는 구문, 모듈의 일부로 내보내서는 안되는 비 인터페이스 선언 은 내보내기 블록 외부에서 정의됩니다. 선언 은 C / C ++에서 모든 종류의 선언이 될 수 있습니다. 즉, 함수뿐만 아니라 변수, 구조체, 템플릿, 네임 스페이스 및 클래스도 가능합니다.
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
모듈의 중요한 변경 사항은 매크로 및 전 처리기 정의가 모듈에 국한되어 내보내지지 않는다는 것입니다. 따라서 매크로는 가져온 모듈에 영향을주지 않습니다.
#define FILE "my/file"
import std.io; //will not be impacted by the above definition
현재의 전 처리기 시스템과 모듈이 공존 할 수 있으며 예를 들어 매크로를 포함하기 위해 헤더를 계속 사용할 수 있습니다.
자세한 내용은 초안을 읽는 것이 좋습니다.
Clang 모듈
Clang은 clang 모듈 페이지 에서 찾을 수있는 모듈 구현을 작업하고 있습니다 . 그러나 clang은 현재 모듈에 대한 구체적인 구문을 구현하지 않습니다. 즉, 위에서 언급 한 구문 중 어느 것도 Clang에 의해 구현되지 않았습니다. 이를 설명하기 위해 페이지에는 다음 내용이 포함되어 있습니다.
현재 임포트 선언을위한 C 또는 C ++ 구문이 없습니다. Clang은 C ++위원회에서 모듈 제안을 추적합니다. 오늘 모듈을 가져 오는 방법을 보려면 가져 오기로 포함 섹션을 참조하십시오.
현재 Clang에 의해 구현 된 주요 부분은 여전히 헤더 파일을 사용하는 기존 코드에 대한 모듈 맵을 작성할 수있는 "모듈 맵 언어"입니다.
모듈에서 매크로 내보내기
위에서 언급했듯이 매크로 내보내기가 최종 모듈 TS의 일부가 될지 여부는 여전히 불분명합니다 . 에서 P0273R1 다음 구문 매크로의 수출을 위해 제안되었다 :
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);