ãã®ããŒãžã¯C++20ã«æ¡çšãããèšèªæ©èœã®å€æŽã解説ããŠããŸãã
ã®ã¡ã®C++èŠæ Œã§ããã«å€æŽãããå Žåãããããé¢é£é ç®ãåç §ããŠãã ããã
æŠèŠ
C++20ã§ã¯ãããããŒãã¡ã€ã«ã»ãœãŒã¹ãã¡ã€ã«ã«ä»£ããæ°ããªãã¡ã€ã«åå²ã®ä»çµã¿ãšããŠã¢ãžã¥ãŒã«ãå°å ¥ãããã
ã¢ãžã¥ãŒã«ã¯ç¿»èš³åäœã®å é ã§ã¢ãžã¥ãŒã«å®£èšãè¡ãããšã«ãã宣èšããã
export module mylib;
ã¢ãžã¥ãŒã«ã®äžã§ã¯ã颿°ãåãªã©ã®å®£èšã« export ããŒã¯ãŒããä»ããŠå®£èšããšã¯ã¹ããŒãã§ããã
export module mylib;
namespace mylib {
export struct myfunc_result_t {
int x, y;
};
export myfunc_result_t myfunc() { /*...*/ };
};
ã¢ãžã¥ãŒã«ãå©çšããã«ã¯ãã€ã³ããŒã宣èšãè¡ããããã«ãããã€ã³ããŒãããã¢ãžã¥ãŒã«ããšã¯ã¹ããŒãããŠãã宣èšãèŠããããã«ãªãã
import mylib;
// iostreamãªã©ãäžéšã®ããããŒã¯ã€ã³ããŒã(â ã€ã³ã¯ã«ãŒã)å¯èœ
import <iostream>;
int main() {
// ãããã®åã颿°ã®å®£èšã¯ãã®ç¿»èš³åäœã«ã¯ç¡ããã
// mylibã§ãšã¯ã¹ããŒãããŠããã®ã§ã䜿çšããããšãã§ããã
mylib::myfunc_result_t ret = mylib::myfunc();
std::cout << ret.x << std::endl;
}
ã¢ãžã¥ãŒã«ã¯åäžã®ç¿»èš³åäœã§æ§æããããšããè€æ°ã®ç¿»èš³åäœã§æ§æããããšãã§ããã
æšæºã©ã€ãã©ãªã¯ãC++23ã§ã¢ãžã¥ãŒã«åãããã詳ããã¯ã¢ãžã¥ãŒã«(ã©ã€ãã©ãª)ãåç §ã
C++20ã§ããC++ã©ã€ãã©ãªã®ããããŒãã¡ã€ã«ã¯ã¢ãžã¥ãŒã«ã®ããã«æ±ãããšãã§ããã¢ãžã¥ãŒã«æ©èœã®æ©æµãåãããã(ããããŒãŠããã)ã
仿§
翻蚳åäœã®åé¡
C++20ã§ã¯ç¿»èš³åäœããã®åœ¹å²ã«ãã£ãŠçްããåé¡ãããã
ãŸããã¢ãžã¥ãŒã«ãæ§æãã翻蚳åäœ(ã¢ãžã¥ãŒã«ãŠããã)ãšãã以å€(åŸæ¥ã®ç¿»èš³åäœãã¹ãŠ)ã®åºå¥ãããã
ã¢ãžã¥ãŒã«ãŠãããã¯ããã«ã€ã³ã¿ãŒãã§ãŒã¹ãšå®è£ ã«åããããã
- ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããã
åŸæ¥ã®ããããŒãã¡ã€ã«ã«çžåœãã翻蚳åäœ(#includeã®ããã«ãœãŒã¹ãã¡ã€ã«ã«å±éãããããšã¯ãªããåç¬ã§ç¿»èš³åäœã«ãªã)ãå€éš(å¥ã®ã¢ãžã¥ãŒã«)ã«å ¬éããã宣èšãå®çŸ©ãæžãã - ã¢ãžã¥ãŒã«å®è£
ãŠããã
åŸæ¥ã®ãœãŒã¹ãã¡ã€ã«ã«çžåœãã翻蚳åäœãå ¬éããªã宣èšãå®çŸ©ãæžãã
ãŸããããããã«ã¢ãžã¥ãŒã«æ¬äœãšããŒãã£ã·ã§ã³ãšããåºå¥ãããã
ããŒãã£ã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ãæ§æãããã¡ã€ã«ãããã«åå²ããããã«äœ¿ããã®ã§ãå éšçã«ã¯å¥ã¢ãžã¥ãŒã«ã®ããã«èŠããããå€éšããã¯èŠããªããã¡ã€ã«ã§ããã
ãŸãšãããšã以äžã®ããã«ãªãã
- 翻蚳åäœ
- ã¢ãžã¥ãŒã«ãŠããã
- ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããã
- ãã©ã€ããªãŒã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹
- ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³
- ã¢ãžã¥ãŒã«å®è£
ãŠããã
- ã¢ãžã¥ãŒã«æ¬äœã®å®è£ ãŠããã(ç¹å¥ãªåç§°ç¡ã)
- ã¢ãžã¥ãŒã«å®è£ ããŒãã£ã·ã§ã³
- ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããã
- ã¢ãžã¥ãŒã«ãŠããã以å€(ç¹å¥ãªåç§°ç¡ã)
- ã¢ãžã¥ãŒã«ãŠããã
ã¢ãžã¥ãŒã«å®£èš
ã¢ãžã¥ãŒã«å®£èšã®æ§æã¯ä»¥äžã®ããã«ãªãïŒ
export(opt) module ã¢ãžã¥ãŒã«å :ããŒãã£ã·ã§ã³å(opt) 屿§(opt);
- ã¢ãžã¥ãŒã«å®£èšã¯ç¿»èš³åäœããã1åã ããååãšããŠç¿»èš³åäœã®å é ã«èšè¿°ãããã¢ãžã¥ãŒã«å®£èšãå«ã翻蚳åäœãã¢ãžã¥ãŒã«ãŠããããšããã
exportãããå Žåã¯ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠãããããªãå Žåã¯ã¢ãžã¥ãŒã«å®è£ ãŠãããã«ãªãã- ããŒãã£ã·ã§ã³åãããå Žåã¯ããããã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³ãã¢ãžã¥ãŒã«å®è£ ããŒãã£ã·ã§ã³ã«ãªãã
ã©ã®ã¢ãžã¥ãŒã«ããå¿ ããã 1ã€ã®ãã©ã€ããªãŒã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããããæããªããã°ãªããªãã ãã以å€ã®ã¢ãžã¥ãŒã«ãŠãããã®åæ°ã¯ä»»æã§ããããã ããããŒãã£ã·ã§ã³åã¯ã¢ãžã¥ãŒã«å ã§éè€ããŠã¯ãªããªãã
export module foo; // fooã®ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããã
module foo; // fooã®ã¢ãžã¥ãŒã«å®è£
ãŠããã
module foo.bar; // foo.barã®ã¢ãžã¥ãŒã«å®è£
ãŠããã
export module bar [[deprecated]]; // 屿§
export module lib:part; // libã¢ãžã¥ãŒã«ã®ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³part
module lib:internal; // libã¢ãžã¥ãŒã«ã®ã¢ãžã¥ãŒã«å®è£
ããŒãã£ã·ã§ã³internal
次ã®ã¢ãžã¥ãŒã«Aã¯4ã€ã®ç¿»èš³åäœãããªãã
// P1103R3ããåŒçš
// 翻蚳åäœ1 ãã©ã€ããªãŒã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããã
export module A;
export import :Foo;
export int baz();
// 翻蚳åäœ2 ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³
export module A:Foo;
import :Internals;
export int foo() { return 2 * (bar() + 1); }
// 翻蚳åäœ3 ã¢ãžã¥ãŒã«å®è£
ããŒãã£ã·ã§ã³
module A:Internals;
int bar();
// 翻蚳åäœ4 ã¢ãžã¥ãŒã«å®è£
ãŠããã
module A;
import :Internals;
int bar() { return baz() - 10; }
int baz() { return 30; }
ã¢ãžã¥ãŒã«å®£èšã¯1è¡ã§æžãå¿
èŠããããããªããã»ããµã§çæããŠã¯ãªããªããããã¯ã#ifãªã©ã«ããåãæ¿ãã#includeã#defineã«ãã眮æãªã©ã«ãããã®ãå«ããåŸè¿°ã®ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ããèšè¿°ããå Žåãé€ããã¢ãžã¥ãŒã«å®£èšã®åã«ããŒã¯ã³ããã£ãŠã¯ãªããªãã
ã¢ãžã¥ãŒã«åã®è©³çް
ã¢ãžã¥ãŒã«åã¯ãèå¥åãŸãã¯èå¥åããããã§ç¹ãã ãã®(äŸãã°ãfooãstd.core)ã§ããã
stdãšstdããå§ãŸãããããã¢ãžã¥ãŒã«ååã³äºçŽèªãå«ãã¢ãžã¥ãŒã«åã¯ãä»åŸã®èŠæ ŒãåŠçç³»ã®ããã«äºçŽãããŠããã®ã§ããŠãŒã¶ãŒå®çŸ©ã®ã¢ãžã¥ãŒã«åãšããŠäœ¿ãããšã¯ã§ããªãã- ã¢ãžã¥ãŒã«ã®ååã¯ãã¢ãžã¥ãŒã«ã«å±ããåã颿°ãªã©ã®ååãšã¯ç¡é¢ä¿ã§ããã
- åŠçç³»ã®äžã«ã¯ãã¢ãžã¥ãŒã«ãŠãããã®ãã¡ã€ã«åãšã¢ãžã¥ãŒã«åãæã£ãŠããããšãæåŸ ãããã®ããã(ããã§ãªãå Žåã¯è¿œå ã®ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ãå¿ èŠã«ãªã)ã
ã¢ãžã¥ãŒã«åã«ã¯ãããã䜿ãããããäžæ¹ã§èå¥åã«ã¯ãããã䜿ããªãããã®ãããªççŸããããããã¢ãžã¥ãŒã«åã«ãããã䜿ããšããŒã¯ã³ãåå²ãããã ãã®ãããèå¥åã®èŠåã¯åå²ãããããããã®ããŒã¯ã³ã«é©çšãããã
module foo . bar; // OK. 'foo.bar'ãšçãã
module foo . /*comment*/ bar; // OK. 'foo.bar'ãšçãã
module foo . . bar; // NG. ãããã®éã«èå¥åããªã
module _Foo.bar // NG. èå¥å'_Foo'ã¯äºçŽãããŠãã
module foo__bar // NG. èå¥å'foo__bar'ã¯äºçŽãããŠãã
module foo.__bar.baz // NG. èå¥å'__bar'ã¯äºçŽãããŠãã
module foo.version.0 // NG. èå¥åã®1æåç®ã¯æ°åã«ã§ããªã
ãã©ã€ããŒãã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ã
ãã©ã€ããŒãã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã¯ã1ãã¡ã€ã«ã§ã¢ãžã¥ãŒã«ãå®çŸ©ãã€ã€ã€ã³ã¿ãŒãã§ãŒã¹ãšå®è£ ãåé¢ããããã®æ©èœã§ããã
export module foo;
// ã¢ãžã¥ãŒã«ã®ã€ã³ã¿ãŒãã§ãŒã¹
module :private;
// ãã©ã€ããŒãã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ã
ãã©ã€ããŒãã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ããèšè¿°ããå Žåããã®ã¢ãžã¥ãŒã«ã¯ç¿»èš³åäœ(å¿ ç¶çã«ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããã)ã1ã€ããæã€ããšãã§ããªãã
ã°ããŒãã«ã¢ãžã¥ãŒã«
C++20ã§ã¯ãååã®ããã¢ãžã¥ãŒã«ã«å±ããŠããªã宣èšã¯ã°ããŒãã«ã¢ãžã¥ãŒã«ã«å±ããŠããã
ã°ããŒãã«ã¢ãžã¥ãŒã«ã®æ§è³ªã¯ä»¥äžã®éãã
- ååãæãããã€ã³ããŒãããããšã¯ã§ããªãã
- 宣èšããšã¯ã¹ããŒãããããšã¯ã§ããªãã
- ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããããæã€ããšã¯ã§ããªãã
ã°ããŒãã«ã¢ãžã¥ãŒã«ãšã¯ãèŠããã«åŸæ¥éãã®ãã¢ãžã¥ãŒã«ã§ã¯ãªãã³ãŒãã®ããšã§ãããC++20ã§ã¯ãmain颿°ã¯ã°ããŒãã«ã¢ãžã¥ãŒã«ã«å±ããŠããªããã°ãªããªãã
ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ã
ã¢ãžã¥ãŒã«å®£èšã®åã«ã°ããŒãã«ã¢ãžã¥ãŒã«ã®å®è£ ãæžããããããã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ããšããã
module; // ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã®å®£èš
#include "lib.h"
export module foo; // ã¢ãžã¥ãŒã«ã®å®£èš(ãã®äžã®è¡ãŸã§ãã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ã)
- ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãå ã®å®£èšãå®çŸ©ã¯ãåŸç¶ã®ã¢ãžã¥ãŒã«ã§ã¯ãªãã°ããŒãã«ã¢ãžã¥ãŒã«ã«å±ããã
- ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã«ã¯ããªããã»ããµãã£ã¬ã¯ãã£ã以å€ãæžãããšã¯ã§ããªãã
- ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãå ã®å®£èšã¯ãåŸç¶ã®ã¢ãžã¥ãŒã«ã«å±ãã宣èšããåç §ãããŠããªãå Žåã¯ãç Žæ£(discard)ãããã
- ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã®å®£èšã¯1è¡ã§æžãå¿
èŠããããããªããã»ããµã§çæããŠã¯ãªããªããããã¯ã
#ifãªã©ã«ããåãæ¿ãã#includeã#defineã«ãã眮æãªã©ã«ãããã®ãå«ããã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã®åã«ããŒã¯ã³ããã£ãŠã¯ãªããªãã
ãšã¯ã¹ããŒã
宣èšã®åã«exportããŒã¯ãŒããä»å ããããšã§ãã®å®£èšããšã¯ã¹ããŒãã§ããã
ãšã¯ã¹ããŒã宣èšã¯ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠãããå ã®åå空éã¹ã³ãŒãã§è¡ããããã ãã以äžã®å Žæã§ã¯äžå¯ã
- ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã®äž
- ãã©ã€ããŒãã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã®äž
- ç¡ååå空éã®äž
export int x; // 倿°ã®ãšã¯ã¹ããŒã
export class x{ /*...*/ }; // ã¯ã©ã¹ã®ãšã¯ã¹ããŒã
export namespace x { /*...*/ } // åå空éã®ãšã¯ã¹ããŒã
export template<class T> foobar(); // 颿°ãã³ãã¬ãŒãã®ãšã¯ã¹ããŒã
ãšã¯ã¹ããŒãã§ããã®ã¯æ°ããªååãå°å ¥ãã宣èšã®ã¿ã§ããããã ãããã®ååã¯å éšãªã³ã±ãŒãžãæã£ãŠã¯ãããªãã
// P1103R3ããåŒçš
export module M;
export namespace {} // ãšã©ãŒ: æ°ããªååã宣èšããŠããªã
export namespace {
int a1; // ãšã©ãŒ: å
éšãªã³ã±ãŒãžãæã€ååã¯ãšã¯ã¹ããŒãã§ããªã
}
namespace {
export int a2; // ãšã©ãŒ: å
éšãªã³ã±ãŒãžãæã€ååã¯ãšã¯ã¹ããŒãã§ããªã
}
export namespace N { // OK
int x; // OK: ãšã¯ã¹ããŒãããã
static_assert(1 == 1); // ãšã©ãŒ: æ°ããªååã宣èšããŠããªã
}
export static int b; // ãšã©ãŒ: æç€ºçã«staticã§å®£èšãããŠããååã¯ãšã¯ã¹ããŒãã§ããªã
export int f(); // OK
export namespace N { } // OK
export using namespace N; // ãšã©ãŒ: æ°ããªååã宣èšããŠããªã
ãŸããæ³¢ã«ãã³ã«exportãã€ããããšã§ããã®äžã®å®£èšããŸãšããŠãšã¯ã¹ããŒãã§ããã
- ãã®æ³¢ã«ãã³ã¯ã¹ã³ãŒããäœããªã
export {
struct Foo { /*...*/ }; // ãšã¯ã¹ããŒãããã
static_assert(std::is_trivially_copyable_v<Foo>); // ãšã©ãŒ: æ°ããªååã宣èšããŠããªã
using namespace std; // ãšã©ãŒ: æ°ããªååã宣èšããŠããªã
}
ãŸãšãããšã次ã®ãããªå®£èšã¯ãšã¯ã¹ããŒããããã
- æç€ºçã«export宣èšãããŠãã宣èš
- æç€ºçã«export宣èšãããŠããåå空éã®å®çŸ©ã®äžã«ãã宣èš
- ãšã¯ã¹ããŒãããã宣èšãå«ãåå空éã®å®çŸ©
exportãããã¯ã®äžã«ãã宣èš
宣èšã¯å宣èšã§ããããå宣èšã«ãã£ãŠãšã¯ã¹ããŒãã®æç¡ãå€ããããšã¯ãªããããªãã¡ã
- ãšã¯ã¹ããŒããããŠãã宣èšã®å宣èšã¯ãæé»çã«ãšã¯ã¹ããŒããããã
- ãšã¯ã¹ããŒããããŠããªã宣èšã®å宣èšããšã¯ã¹ããŒãããããšã¯ã§ããªãã
ãšã¯ã¹ããŒãããã宣èšãå°å ¥ããååã¯ããã®ã¢ãžã¥ãŒã«ãããšã¯ã¹ããŒããããã
ã¢ãžã¥ãŒã«ãªã³ã±ãŒãž
C++20ã§ã¯ãæ°ãã«ã¢ãžã¥ãŒã«ãªã³ã±ãŒãžã远å ãããã
- ãšã¯ã¹ããŒãããŠããååã¯å€éšãªã³ã±ãŒãžãæã€ã
- ååã®ããã¢ãžã¥ãŒã«ã«å±ããŠããŠãšã¯ã¹ããŒãããŠããªãååã¯ãã¢ãžã¥ãŒã«ãªã³ã±ãŒãžãæã€ã
- ã¢ãžã¥ãŒã«ãªã³ã±ãŒãžãæã€ååã¯ãåäžã¢ãžã¥ãŒã«å ã§åç §ã§ããã
ã€ã³ããŒã
ã€ã³ããŒã宣èšã¯æ¬¡ã®ããã«ãªãïŒ
export(opt) import lib; // libã®ã€ã³ããŒã
ã€ã³ããŒã宣èšã¯ãã¢ãžã¥ãŒã«ã®ã€ã³ã¿ãŒãã§ãŒã¹ãŠããããã€ã³ããŒãããã
- ã¢ãžã¥ãŒã«æ¬äœã®å®è£ ãŠãããã¯ãã©ã€ããªãŒã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠããããæé»çã«ã€ã³ããŒãããããœãŒã¹ãã¡ã€ã«ãšååã®ããããŒãã¡ã€ã«ãã€ã³ã¯ã«ãŒãããããšã¯å€ããããããèªååãããã®ã§ããã
ã€ã³ããŒãããã翻蚳åäœã§ãšã¯ã¹ããŒããããŠããååã¯ãã€ã³ããŒã宣èšãèšè¿°ãã翻蚳åäœã«ãããŠå¯èŠ(visible)ãšãªãã ååãå¯èŠã§ãããšãããã€ãã®ãšãã«éããååã¯ååæ¢çŽ¢ã®åè£ãšãªãã
ãã¯ããusing namespaceã¯ãšã¯ã¹ããŒãã§ããªãã®ã§ãã€ã³ããŒãã«ãã£ãŠåã蟌ãŸããããšã¯ãªãã
ããããŒãã¡ã€ã«äžã§ã® using namespace ã¯ãã°ãã°é¿ããããããã¢ãžã¥ãŒã«ã§ã¯åé¡ãªã䜿ãããšãã§ããã
ã¢ãžã¥ãŒã«ãŠãããã®äžã§ã¯ãã€ã³ããŒã宣èšã¯ã¢ãžã¥ãŒã«ãŠãããã®æ¬äœ(ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã§ã¯ãªãéšå)ã®å é ã§è¡ããªããã°ãªããªãã
ã€ã³ããŒã宣èšã¯1è¡ã§æžãå¿
èŠããããimportããŒã¯ãŒããexportããŒã¯ãŒããããªããã»ããµã§çæããŠã¯ãªããªãããŸããã¢ãžã¥ãŒã«ãŠãããå
ã§ã¯#includeã®çµæãšããŠã€ã³ããŒã宣èšãçæããŠã¯ãªããªãã
åãšã¯ã¹ããŒã
ã€ã³ããŒã宣èšã«exportããŒã¯ãŒããä»ããããšã§ãã¢ãžã¥ãŒã«ãåãšã¯ã¹ããŒãã§ããã
ã¢ãžã¥ãŒã«ãã€ã³ããŒããããšããã®ã¢ãžã¥ãŒã«ãåãšã¯ã¹ããŒãããŠããã¢ãžã¥ãŒã«ãåæã«ã€ã³ããŒããããåãšã¯ã¹ããŒãã¯ãã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ã§ããã§ããªãã
ããŒãã£ã·ã§ã³ã®ã€ã³ããŒã
ããŒãã£ã·ã§ã³ã¯å éšçã«ã¯å¥ã®ã¢ãžã¥ãŒã«ã®ããã«æ¯ãèãã®ã§ãããŒãã£ã·ã§ã³å ã®å®£èšãªã©ãå©çšããã«ã¯ã€ã³ããŒããå¿ èŠã§ããã
ããŒãã£ã·ã§ã³ã¯äž»ãšãªãã¢ãžã¥ãŒã«ãç°ãªãå Žåã¯ã€ã³ããŒãã§ããªãã®ã§ãééãã®ãªãããã«ãã€ã³ããŒã宣èšã«ã¯ã¢ãžã¥ãŒã«ããŒãã£ã·ã§ã³åã ããæžãã
export module datetime;
export import :date; // ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³ date ãã€ã³ããŒã
export import :time; // ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³ time ãã€ã³ããŒã
ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³ã¯ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãåå²ãããã®ãªã®ã§ãå éšã®å®£èšãå€ãžå ¬éããªããã°æå³ããªãããã®ãããã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ããŒãã£ã·ã§ã³ã®ã€ã³ããŒã宣èšã¯å¿ ãåãšã¯ã¹ããŒãããªããã°ãªããªãã
- ããŒãã£ã·ã§ã³å ã®å®£èšã¯ãšã¯ã¹ããŒãããŠããªããŠãèŠãã
- ãã ããåãšã¯ã¹ããŒããããã®ã¯ããŒãã£ã·ã§ã³ããšã¯ã¹ããŒãããŠãã宣èšã®ã¿
ã€ã³ã¿ãŒãã§ãŒã¹äŸå
翻蚳åäœãã¢ãžã¥ãŒã«ãŠãããUã«ã€ã³ã¿ãŒãã§ãŒã¹äŸå(interface dependency)ãæã€ãšã¯ã次ã®ããšãããïŒ
- Uãã€ã³ããŒãããã¢ãžã¥ãŒã«ã€ã³ããŒã宣èšããUãæé»çã«ã€ã³ããŒãããã¢ãžã¥ãŒã«å®£èšãå«ã
- ãŸãã¯ãUã«ã€ã³ã¿ãŒãã§ãŒã¹äŸåãæã€ã¢ãžã¥ãŒã«ãŠãããã«å¯ŸããŠã€ã³ã¿ãŒãã§ãŒã¹äŸåãæã€(æšç§»åŸ)
翻蚳åäœã¯ãèªåèªèº«ã«å¯ŸããŠã€ã³ã¿ãŒãã§ãŒã¹äŸåãæã£ãŠã¯ãªããªã(ã€ã³ã¿ãŒãã§ãŒã¹äŸåé¢ä¿ã¯åŸªç°ããªã)ã
å°éå¯èœæ§
C++20ã§ã¯ã翻蚳åäœãšå®£èšã«å¯ŸããŠå°éå¯èœãšããçšèªã䜿ãããã«ãªã£ãã
翻蚳åäœUãããã°ã©ã ã®ç¹Pããå¿ ç¶çã«å°éå¯èœ(necessarily reachable) ãšã¯ã次ã®ããšãããïŒ
- Uãã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠãããã§ãããç¹Pãå«ã翻蚳åäœãç¹Pã«å ç«ã£ãŠUã«ã€ã³ã¿ãŒãã§ãŒã¹äŸåãæã£ãŠãã
- ãŸãã¯ãç¹Pãå«ã翻蚳åäœãç¹Pã«å ç«ã£ãŠUãã€ã³ããŒãããŠãã
ç¹Pããå°éå¯èœ(reachable)ãªç¿»èš³åäœãšã¯ã次ã®ãã®ãããïŒ
- ç¹Pããå¿ ç¶çã«å°éå¯èœãªç¿»èš³åäœ
- ãã®ä»ãç¹Pãå«ã翻蚳åäœãã€ã³ã¿ãŒãã§ãŒã¹äŸåãæã€ç¿»èš³åäœã§ãã£ãŠãåŠçç³»ãèŠå®ãããã®
宣èšDãç¹Pããå°éå¯èœãšã¯ã次ã®ããšããã
- DãPãšåã翻蚳åäœã«ãããPã«å ç«ã£ãŠå®£èšãããŠãã
- ãŸãã¯ãDãPããå°éå¯èœãªç¿»èš³åäœã«ãã£ãŠãç Žæ£(discard)ãããŠãããããã©ã€ããŒãã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãå ã«ããªã
C++20ãŸã§ã¯å°éå¯èœãšããçšèªã¯ãªãã£ãããåè ã®æ¡ä»¶ãæºãã宣èšã ããåç §ã§ããŠããã 宣èšãå°éå¯èœã§ãããšãããã€ãã®ãšãã«éãã宣èšã®æå³è«çãªæ§è³ª(semantic property)ãå©çšã§ããã
äŸãã°ãã¯ã©ã¹å®çŸ©ã¯ã¯ã©ã¹ã®å®å šæ§ãšããæ§è³ªãæã£ãŠãããã¯ã©ã¹å®çŸ©ãå°éå¯èœã§ãããšããã®ã¯ã©ã¹ã¯å®å šã§ããã
ãšã¯ã¹ããŒãã®æç¡ãšã¯é¢ä¿ãªããã¢ãžã¥ãŒã«ãã€ã³ããŒãããã ãã§ã€ã³ã¿ãŒãã§ãŒã¹äŸåãçºçãããã®ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ãŠãããããã³ãã®äžã®å®£èšãžå°éå¯èœãšãªãã
ã¢ãžã¥ãŒã«ã«ãããODR
åãããŒã¯ã³åã§ããã°åå®çŸ©ããŠãè¯ããšããODRã®äŸå€ã¯ããã®å®çŸ©ãååã®ããã¢ãžã¥ãŒã«ã«å±ããå Žåã¯é©çšãããªãã
ãã®äŸå€ã¯ããããŒãã¡ã€ã«ã«ã¯ã©ã¹å®çŸ©ãªã©ãæžããŠã€ã³ã¯ã«ãŒãããéã«ODRéåã«ãªããªãããã®èŠå®ã§ããã ã¢ãžã¥ãŒã«ãå®çŸ©ããå Žåã¯ããããŒãã¡ã€ã«ã¯äœ¿ããªããããå®è³ªçãªåœ±é¿ã¯ãªãã
è€æ°ã®ã¢ãžã¥ãŒã«ã#includeã§åã宣èšãåã蟌ãã å Žåã¯ODRéåãšãªã£ãŠããŸãã®ã§ãåºæ¬çã«ååã®ããã¢ãžã¥ãŒã«ã®æ¬äœã§#includeã䜿çšããŠã¯ãªããªãã
ã¢ãžã¥ãŒã«ãŠãããã®äžã§#includeã䜿çšãããå Žåãã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãå
ã§è¡ãã°åŸæ¥éãã«ODRã®äŸå€ãšãªãã
module; // ã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãã®å®£èš
#include "lib.h" // "lib.h"äžã®å®£èšã¯ã°ããŒãã«ã¢ãžã¥ãŒã«ã«å±ãã(ODRã®äŸå€ãæå¹)ã
export module foo; // ã¢ãžã¥ãŒã«ã®å®£èš(ãã®äžã®è¡ãŸã§ãã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ã)
#include "lib.h" // "lib.h"äžã®å®£èšãã¢ãžã¥ãŒã«fooã«å«ãŸããŠããŸã(ODRã®äŸå€ãªã = ODRéåã®å¯èœæ§å€§)ã
ããããŒãŠããã
äžéšã®ããããŒãã¡ã€ã«ã¯ãã¢ãžã¥ãŒã«ãšããŠã€ã³ããŒãããããšãã§ããããã®æ©èœããã³ããããŒãã¡ã€ã«ããçæããã翻蚳åäœãããããŒãŠããããšããã
import <foo.h>; // foo.hãããããŒãŠããããšããŠã€ã³ããŒã
ãã ããã€ã³ããŒãã§ããããããŒãã¡ã€ã«(ã€ã³ããŒã¿ãã«ããããŒ)ã¯ä»¥äžã®ãã®ã«éãããã
- C++ã©ã€ãã©ãªããããŒ(C++æšæºã©ã€ãã©ãªããããŒã®ãã¡ãCèšèªæšæºã©ã€ãã©ãªããããŒã«ç±æ¥ãããã®(
<cstdio>ãªã©)以å€) - ãã®ä»ãåŠçç³»å®çŸ©ã®ããããŒ
ããããŒãŠããããã€ã³ããŒãããŠããã®å
容ãå±éãããããšã¯ãªãããããããŒãŠãããå
ã®ãã¯ãã䜿ããããã«ãªããããã«ãã#includeãšã»ãŒåã广ãåŸãããã
ããªããã»ããµã¯ãéã¢ãžã¥ãŒã«ãŠãããã«çŸããã€ã³ããŒã¿ãã«ããããŒã«å¯Ÿãã#includeãã£ã¬ã¯ãã£ããimport宣èšã«çœ®æããŠãããããšã«ãªã£ãŠãããã¢ãžã¥ãŒã«ãŠãããã«ãããŠã¯ãæç€ºçã«import宣èšãããã»ããããã
ããããŒãŠããããšãªãããããŒãã¡ã€ã«èªäœã¯ã¢ãžã¥ãŒã«å®£èšãæãŠãªãããexport宣èšãã§ããªãã
ããããŒãŠãããå ã®å®£èšã¯ãã¹ãŠã°ããŒãã«ã¢ãžã¥ãŒã«ã«å±ããååãå°å ¥ãã宣èšãªãã°æé»çã«ãšã¯ã¹ããŒããããã
// P1103R3ããåŒçš
// a.h
#define X 123 // #1
#define Y 45 // #2
#define Z a // #3
#undef X // a.hã§ã¯ããã§#1ãç¡å¹ã«ãªã
// b.h
import "a.h"; // b.hã§ã¯ããã§#1, #2, #3ãå®çŸ©ããã#1ãç¡å¹ã«ãªã
#define X 456 // OK: #1ã§å®çŸ©ããXã¯ãã§ã«ç¡å¹
#define Y 6 // ãšã©ãŒ: #2ã§å®çŸ©ããYãæå¹
// c.h
#define Y 45 // #4
#define Z c // #5
// d.h
import "a.h"; // d.hã§ã¯ããã§#1, #2, #3ãå®çŸ©ããã#1ãç¡å¹ã«ãªã
import "c.h"; // d.hã§ã¯ããã§#4, #5ãå®çŸ©ããã
int a = Y; // OK: #4ã¯#2ãšåã
int c = Z; // ãšã©ãŒ: #5ã¯#3ãç°ãªãå€ã§åå®çŸ©ããŠãã
ããããŒãŠãããã¯åãšã¯ã¹ããŒãã§ããããããããŒãŠãããã鿥çã«ã€ã³ããŒãããå Žåã¯ãã¯ãã¯ã€ã³ããŒããããªãã
// lib.h
inline int f(){ return NUM; }
#define NUM 1000
// lib_mod.cpp
// lib.häžã®å®£èšããã¹ãŠãšã¯ã¹ããŒãããã¢ãžã¥ãŒã«lib
export module lib;
export import "lib.h";
// main.cpp
import lib;
int main() {
1 + f(); // OK
1 + NUM; // ãšã©ãŒ: ãã¯ãã¯åãšã¯ã¹ããŒãããŠãåŒãç¶ãããªã
}
includeãšã®éã
ããããŒãŠããããã€ã³ããŒããããšä»¥äžã®ããšãèµ·ããã
- ããããŒãã¡ã€ã«ã翻蚳ãã§ãŒãº7ãŸã§ã³ã³ãã€ã«ãããã®ç¿»èš³åäœ(ããããŒãŠããã)ãã€ã³ããŒãããã
- ããã«ãããããŒãã¡ã€ã«ã®ç¿»èš³ãã§ãŒãº4çµäºæç¹ã§å®çŸ©ãããŠãããã¯ããã€ã³ããŒã宣èšã®çŽåŸã§å®£èšãããããã®åŠçã¯ããªããã»ããµã§è¡ãããã
ããããŒãã¡ã€ã«ãæ°ããªç¿»èš³åäœãšããŠã³ã³ãã€ã«ãããç¹ãåŸæ¥ã® #include ãšã¯ç°ãªãã
ããããŒãŠãããå
ã®ãã¯ãã¯ã€ã³ããŒãã§ããããéã¯èµ·ãããªããããªãã¡ãimportãæžãã翻蚳åäœã«ãããããªããã»ããµã®ç¶æ
ãããããŒãŠãããå
ã«åœ±é¿ãäžããããšã¯ãªãã
ããããŒãŠããããå¿ èŠã«ãªã£ãèæ¯ã»çµç·¯
åã«ããããŒãã¡ã€ã«ã䜿ãããã ãã§ããã°ãã°ããŒãã«ã¢ãžã¥ãŒã«ãã©ã°ã¡ã³ãå ã§ã€ã³ã¯ã«ãŒãã§ããã
ããããåŠçç³»ã¯ããããŒãã¡ã€ã«ãã€ã³ããŒã¿ãã«ããããŒã«æå®ããããšã§ããããã«å¯Ÿãã #include ã import ã«çœ®ãæããããšãã§ããã
ããã°ã©ã å
šäœã§ããããããŒãã¡ã€ã«ã«å¯Ÿãã #include ã import ã«çœ®ãæãã£ãå Žåããã®ããããŒãã¡ã€ã«ã¯1åããã³ã³ãã€ã«ãããªããªããã³ã³ãã€ã«æéã®ççž®ã«ã€ãªããå¯èœæ§ãããããã®ããã«ãC++20ãšããŠã³ã³ãã€ã«ããã ãã§åŸæ¥ã®ã³ãŒãã§ãæ©æµãåŸãããšãã§ããã
èšèªæ©èœãšããŠã®ã¢ãžã¥ãŒã«ãå°å ¥ãããŠãããã§ã«ããã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããã¢ãžã¥ãŒã«ã«ãŸãšããããã«ã¯é·ãæéãããããããéæž¡æã«ãããŠããããŒãŠãããã¯åœ¹ã«ç«ã€ã
ãã«ã
ããã°ã©ã ã®ãã«ãã¯èŠæ Œã®ç¯å²å€ãªã®ã§ãããã§ã¯äžè¬è«ãè¿°ã¹ãã
ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ãããšãäœããã®äžé衚çŸ(ã³ã³ãã€ã«æžã¿ã¢ãžã¥ãŒã«)ãä¿åãããã
- ãã³ãã¬ãŒãã¯ãã³ãã¬ãŒãã®ãŸãŸïŒå®äœåããããšãªãïŒãšã¯ã¹ããŒãã§ããã®ã§ãäžé衚çŸã¯æ©æ¢°èªã§ã¯ãªããããããããªã³ã³ãã€ã«ãããããŒãšäŒŒããããªãã®ã«ãªããããåŸãªãã
- ã¢ãžã¥ãŒã«Aãã€ã³ããŒãããããã°ã©ã ãã³ã³ãã€ã«ããã«ã¯ãã¢ãžã¥ãŒã«Aã®ã³ã³ãã€ã«æžã¿ã¢ãžã¥ãŒã«ãååšããªããã°ãªããªãã
- ã¢ãžã¥ãŒã«Aãã€ã³ããŒãããããã°ã©ã ããªã³ã¯ããã«ã¯ãã¢ãžã¥ãŒã«Aã«é¢ããã¢ãžã¥ãŒã«ãŠãããããçæããããªããžã§ã¯ããã¡ã€ã«ãã©ã€ãã©ãªãªã©ãå¥éãªã³ã¯ããªããã°ãªããªãã
ãã®æ©èœãå¿ èŠã«ãªã£ãèæ¯ã»çµç·¯
ããªããã»ããµã«ããã€ã³ã¯ã«ãŒãã¯ãããããŒãã¡ã€ã«ã®å 容ããã®å Žã«å±éããã ããã«ã¯æ¬¡ã®ãããªåé¡ãææãããŠããã
- ã³ã³ãã€ã«æéãé·ããªã
- ããããŒãã¡ã€ã«ã®å 容ãååž°çã«å±éãããããã°ã©ã ãé·ããªãïŒHello worldã ãã§ãæ°äžè¡ã«éããïŒ
- ããã«ãå±éã翻蚳åäœããšã«è¡ãããã®ã§ãå šäœã§èŠããšåãããããŒãã¡ã€ã«ãäœåºŠãè§£æããã
- ããªããã»ããµã®ç¶æ
ã«ãããã€ã³ã¯ã«ãŒãã®çµæãå€ãã£ãŠããŸã
- ã€ã³ã¯ã«ãŒãã®é çªã«ãã£ãŠãšã©ãŒãèµ·ããããšããã£ãã
- ããããŒãã¡ã€ã«å
ã®èšè¿°ã®åœ±é¿ãåãããã
- 圱é¿ã倧ãããããããããŒãã¡ã€ã«å ã«æžãããšãããããããèšè¿°ããã£ãã
using namespaceããã¯ã(äŸãã°Windowsã«ãããmax)ãªã©ã
ã¢ãžã¥ãŒã«ã¯ã以äžã®ãããªåé¡ã®ãªãããã°ã©ã åå²ã®ä»çµã¿ãšããŠå°å ¥ãããã
é¢é£é ç®
- C++23 ç¡æå³ãªexport宣èšãçŠæ¢ãã
- C++26 ã¢ãžã¥ãŒã«å®£èšã§ã®ã¢ãžã¥ãŒã«åã®ãã¯ãå±éãçŠæ¢ãã
- C++26
main颿°ãã°ããŒãã«ã¢ãžã¥ãŒã«ã«é¢é£ä»ããããšãèš±å¯ - C++26 ã¢ãžã¥ãŒã«å®£èšããåã§ã®
#lineãã£ã¬ã¯ãã£ãã®äœ¿çšãèš±å¯ãã
åç §
- C++C++20ã¢ãžã¥ãŒã«ã®å€é· - Module TSããC++20DISãŸã§ - å°é¢ãèŠäžããå°å¹Žã®è¶³è¹Žã«ãããç§
- P1103R3 Merging Modules
- P1502R1
Standard library header units for C++20
C++ã©ã€ãã©ãªããããŒã¯ã€ã³ããŒã¿ãã«ããããŒãšãªã£ãã - P1703R1 Recognizing Header Unit Imports Requires Full Preprocessing
ããããŒãŠãããã®ã€ã³ããŒã宣èšã«ã€ããŠãæžãæ¹ã#includeãšåçšåºŠãŸã§å¶éãããã - P1766R1 Mitigating minor modules maladies
- P1811R0
Relaxing redefinition restrictions for re-exportation robustness
åæã«å°éå¯èœãšãªããªããã°ODRéåã«ãªããªããšãã仿§ãåé€ãããããŸããã€ã³ããŒã¿ãã«ããããŒã®#includeãimportã«çœ®ãæãããã¯åŠçç³»å®çŸ©ãšãªã£ãã