Aracılığıyla paylaş


C++ içindeki modüllere genel bakış

C++20 modüllerini tanıtır. Modül, kaynak dosyalardan (veya daha kesin olarak bunları içeri aktaran çeviri birimlerinden) bağımsız olarak derlenen bir kaynak kod dosyaları kümesidir.

Modüller, üst bilgi dosyalarının kullanımıyla ilgili sorunların çoğunu ortadan kaldırır veya azaltır. Genellikle derleme sürelerini azaltırlar, bazen önemli ölçüde. Bir modülde bildirilen makrolar, önişlemci yönergeleri ve bildirilmeyen adlar modülün dışında görünmez. Modülü içeri aktaran çeviri biriminin derlenmesi üzerinde hiçbir etkisi yoktur. Makro yeniden tanımlamaları için endişe duymadan modülleri istediğiniz sırada içeri aktarabilirsiniz. İçeri aktarılan çeviri birimindeki bildirimler, içeri aktarılan modülde aşırı yükleme çözümlemesine veya ad arama işlemine katılmaz. Bir modül bir kez derlendikten sonra, sonuçlar dışarı aktarılan tüm türleri, işlevleri ve şablonları açıklayan bir ikili dosyada depolanır. Derleyici bu dosyayı üst bilgi dosyasından çok daha hızlı işleyebilir. Derleyici, modülün bir projede içeri aktarıldığı her yerde yeniden kullanabilir.

Modülleri üst bilgi dosyalarıyla yan yana kullanabilirsiniz. C++ kaynak dosyası modüller ve üst #include bilgi dosyaları da içerebilirimport. Bazı durumlarda, bir üst bilgi dosyasını modül olarak içeri aktarabilirsiniz. Bu, ön işlemciyle işlemek için kullanmaktan #include daha hızlıdır. Modülleri üst bilgi dosyaları yerine yeni projelerde mümkün olduğunca kullanmanızı öneririz. Etkin geliştirme kapsamındaki daha büyük mevcut projeler için eski üst bilgileri modüllere dönüştürmeyi deneyin. Benimsemenizi derleme sürelerinde anlamlı bir azalma elde edip etmediğinize dayandırın.

Modülleri standart kitaplığı içeri aktarmanın diğer yolları ile karşılaştırmak için bkz . Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma.

Microsoft C++ derleyicisinde modülleri etkinleştirme

Visual Studio 2022 sürüm 17.1'den itibaren, C++20 standart modülleri Microsoft C++ derleyicisinde tam olarak uygulanır.

C++20 standardı tarafından belirtilmeden önce, Microsoft modüller için deneysel desteğe sahipti. Derleyici ayrıca aşağıda açıklanan önceden oluşturulmuş Standart Kitaplık modüllerini içeri aktarmayı da desteklemektedir.

Visual Studio 2022 sürüm 17.5'den başlayarak Standart Kitaplığı modül olarak içeri aktarmak hem standartlaştırılır hem de Microsoft C++ derleyicisinde tam olarak uygulanır. Bu bölümde hala desteklenen eski ve deneysel yöntem açıklanmaktadır. Modülleri kullanarak Standart Kitaplığı içeri aktarmanın yeni standartlaştırılmış yolu hakkında bilgi için bkz . Modülleri kullanarak C++ standart kitaplığını içeri aktarma.

Tek bölümlü modüller oluşturmak ve Microsoft tarafından sağlanan Standart Kitaplık modüllerini içeri aktarmak için modüller özelliğini kullanabilirsiniz. Standart Kitaplık modülleri desteğini etkinleştirmek için ve /std:c++latestile /experimental:module derleyin. Visual Studio projesinde, Çözüm Gezgini proje düğümüne sağ tıklayın ve Özellikler'i seçin. Yapılandırma açılan listesini Tüm Yapılandırmalar olarak ayarlayın, ardından Yapılandırma Özellikleri>C/C++>Dil>Etkinleştir C++ Modüllerini Etkinleştir (deneysel) seçeneğini belirleyin.

Bir modül ve bunu kullanan kod aynı derleyici seçenekleriyle derlenmelidir.

C++ Standart Kitaplığını modül olarak kullanma (deneysel)

Bu bölümde, hala desteklenen deneysel uygulama açıklanmaktadır. C++ Standart Kitaplığını modül olarak kullanmanın yeni standartlaştırılmış yolu, Modülleri kullanarak C++ standart kitaplığını içeri aktarma bölümünde açıklanmıştır.

C++ Standart Kitaplığını üst bilgi dosyaları aracılığıyla dahil etme yerine modüller olarak içeri aktararak, projenizin boyutuna bağlı olarak derleme sürelerini hızlandırabilirsiniz. Deneysel kitaplık aşağıdaki adlandırılmış modüllere ayrılır:

  • std.regex üst bilgi içeriğini sağlar <regex>
  • std.filesystem üst bilgi içeriğini sağlar <filesystem>
  • std.memory üst bilgi içeriğini sağlar <memory>
  • std.threading, , , <mutex><condition_variable><future>, <shared_mutex>ve üst bilgilerinin <atomic>içeriğini sağlar<thread>
  • std.core C++ Standart Kitaplığı'ndaki diğer her şeyi sağlar

Bu modülleri kullanmak için kaynak kod dosyasının en üstüne bir içeri aktarma bildirimi ekleyin. Örneğin:

import std.core;
import std.regex;

Microsoft Standart Kitaplığı modüllerini kullanmak için ve seçenekleriyle /EHsc/MD programınızı derleyin.

Örnek

Aşağıdaki örnekte adlı Example.ixxkaynak dosyada basit bir modül tanımı gösterilmektedir. .ixx Uzantı, Visual Studio'daki modül arabirimi dosyaları için gereklidir. Bu örnekte, arabirim dosyası hem işlev tanımını hem de bildirimini içerir. Ancak, tanımları daha sonraki bir örnekte gösterildiği gibi bir veya daha fazla ayrı modül uygulama dosyalarına da yerleştirebilirsiniz.

export module Example; deyimi, bu dosyanın adlı Examplemodülün birincil arabirimi olduğunu gösterir. üzerindeki f() değiştirici, export başka bir program veya modül içeri aktardığında bu işlevin Examplegörünür olduğunu gösterir.

// Example.ixx
export module Example;

#define ANSWER 42

namespace Example_NS
{
   int f_internal() {
        return ANSWER;
      }

   export int f() {
      return f_internal();
   }
}

Dosya MyProgram.cpp tarafından Exampledışarı aktarılan ada erişmek için kullanırimport. Ad alanı adı Example_NS burada görünür, ancak dışarı aktarılmadıkları için tüm üyeleri görünmez. Ayrıca, makrolar ANSWER dışarı aktarılamadığı için makro görünmez.

// MyProgram.cpp
import Example;
import std.core;

using namespace std;

int main()
{
   cout << "The result of f() is " << Example_NS::f() << endl; // 42
   // int i = Example_NS::f_internal(); // C2039
   // int j = ANSWER; //C2065
}

Bildirim import yalnızca genel kapsamda görünebilir.

Modül dil bilgisi

module-name:
module-name-qualifier-seqTercihidentifier

module-name-qualifier-seq:
identifier .
module-name-qualifier-seq identifier .

module-partition:
: module-name

module-declaration:
exportoptmodule-namemodule-partitionmoduleopt optattribute-specifier-seq;

module-import-declaration:
exporttercih etimportmodule-nameattribute-specifier-seq;
exporttercih etimportmodule-partitionattribute-specifier-seq;
exporttercih etimportheader-nameattribute-specifier-seq;

Modülleri uygulama

Modül arabirimi modül adını ve modülün genel arabirimini oluşturan tüm ad alanlarını, türleri, işlevleri vb. dışarı aktarır.
Modül uygulaması , modül tarafından dışarı aktarılan öğeleri tanımlar.
En basit biçimiyle modül, modül arabirimini ve uygulamasını birleştiren tek bir dosya olabilir. Uygulamayı, ve dosyalarının nasıl .h.cpp yapacağına benzer şekilde bir veya daha fazla ayrı modül uygulama dosyasında da yerleştirebilirsiniz.

Daha büyük modüller için modülün bölümlerini bölümler olarak adlandırılan alt modüllere bölebilirsiniz. Her bölüm, modül bölüm adını dışarı aktaran bir modül arabirim dosyasından oluşur. Bir bölümde bir veya daha fazla bölüm uygulama dosyası da olabilir. Bir bütün olarak modül, modülün genel arabirimi olan bir birincil modül arabirimine sahiptir. İsterseniz bölüm arabirimlerini dışarı aktarabilir.

Modül bir veya daha fazla modül biriminden oluşur. Modül birimi, modül bildirimi içeren bir çeviri birimidir (kaynak dosya). Çeşitli modül birimi türleri vardır:

  • Modül arabirim birimi bir modül adını veya modül bölüm adını dışarı aktarır. Modül arabirimi biriminin export module modül bildirimi vardır.
  • Modül uygulama birimi , modül adını veya modül bölüm adını dışarı aktarmaz. Adından da anlaşılacağı gibi bir modül uygular.
  • Birincil modül arabirim birimi modül adını dışarı aktarır. Modülde bir ve yalnızca bir birincil modül arabirim birimi olmalıdır.
  • Modül bölüm arabirimi birimi , modül bölüm adını dışarı aktarır.
  • Modül bölümü uygulama biriminin modül bildiriminde modül bölüm adı vardır ancak anahtar sözcüğü yoktur export .

export anahtar sözcüğü yalnızca arabirim dosyalarında kullanılır. Uygulama dosyası başka bir modülde kullanılabilir import , ancak herhangi bir ad kullanılamaz export . Uygulama dosyaları herhangi bir uzantıya sahip olabilir.

Modüller, ad alanları ve bağımsız değişkene bağımlı arama

Modüllerdeki ad alanlarının kuralları diğer kodlarla aynıdır. Ad alanı içindeki bir bildirim dışarı aktarılırsa, kapsayan ad alanı (bu ad alanında açıkça dışarı aktarılmış olmayan üyeler hariç) örtük olarak da dışarı aktarılır. Bir ad alanı açıkça dışarı aktarılırsa, bu ad alanı tanımındaki tüm bildirimler dışarı aktarılır.

Derleyici, içeri aktarma çeviri birimindeki aşırı yükleme çözümlemeleri için bağımsız değişkene bağımlı arama gerçekleştirdiğinde, işlevin bağımsız değişkenlerinin türünün tanımlandığı aynı çeviri biriminde (modül arabirimleri dahil) bildirilen işlevleri dikkate alır.

Modül bölümleri

Modül bölümü, aşağıdakiler dışında bir modüle benzer:

  • Modülün tamamında tüm bildirimlerin sahipliğini paylaşır.
  • Bölüm arabirimi dosyaları tarafından dışarı aktarılan tüm adlar birincil arabirim dosyası tarafından içeri ve dışarı aktarılır.
  • Bir bölümün adı modül adı ve ardından iki nokta üst üste (): ile başlamalıdır.
  • Bölümlerin herhangi birindeki bildirimler modülün tamamında görünür.\
  • Tek tanım kuralı (ODR) hatalarından kaçınmak için özel bir önlem gerekmez. Bir bölümde bir ad (işlev, sınıf vb.) bildirebilir ve başka bir bölümde tanımlayabilirsiniz.

Bölüm uygulama dosyası şöyle başlar ve C++ standartları perspektifinden bir iç bölümdür:

module Example:part1;

Bölüm arabirimi dosyası şu şekilde başlar:

export module Example:part1;

Başka bir bölümdeki bildirimlere erişmek için bir bölümün bunu içeri aktarması gerekir. Ancak modül adını değil yalnızca bölüm adını kullanabilir:

module Example:part2;
import :part1;

Birincil arabirim birimi, modülün arabirim bölümü dosyalarının tümünü içeri ve yeniden dışarı aktarmalıdır, örneğin:

export import :part1;
export import :part2;

Birincil arabirim birimi bölüm uygulama dosyalarını içeri aktarabilir, ancak dışarı aktaramaz. Bu dosyaların herhangi bir adı dışarı aktarmasına izin verilmez. Bu kısıtlama, bir modülün uygulama ayrıntılarını modülün içinde tutmasına olanak tanır.

Modüller ve üst bilgi dosyaları

Bir yönergeyi modül bildiriminden önce koyarak bir #include modül kaynak dosyasına üst bilgi dosyaları ekleyebilirsiniz. Bu dosyaların genel modül parçasında olduğu kabul edilir. Modül yalnızca açıkça içerdiği üst bilgilerde yer alan genel modül parçasındaki adları görebilir. Genel modül parçası yalnızca kullanılan simgeleri içerir.

// MyModuleA.cpp

#include "customlib.h"
#include "anotherlib.h"

import std.core;
import MyModuleB;

//... rest of file

Hangi modüllerin içeri aktarılacağını denetlemek için geleneksel bir üst bilgi dosyası kullanabilirsiniz:

// MyProgram.h
import std.core;
#ifdef DEBUG_LOGGING
import std.filesystem;
#endif

İçeri aktarılan üst bilgi dosyaları

Bazı üst bilgiler, anahtar sözcüğü kullanılarak import getirilebileceği kadar kendi içinde yer alır. İçeri aktarılan üst bilgi ile içeri aktarılan modül arasındaki temel fark, üst bilgideki önişlemci tanımlarının içeri aktarma programında deyiminden import hemen sonra görünür olmasıdır.

import <vector>;
import "myheader.h";

Ayrıca bkz.

module, import, export
Adlandırılmış modüller öğreticisi
Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma