Yazılım Geliştirme: C ++ 26'daki sözleşmeler | Haberler Online
C ++ 26'daki kısa yansımalardan sonra, şimdi sözleşmeler. Bu, işlevler için ön -sözleşmeler, koşullar yayınlama ve değişmez belirtmenizi sağlar.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Sözleşmeler zaten C ++ 20'nin bir parçası olmalı, ancak standart koloni toplantısında kaldırılmıştır. Herb Sutter, Sutter'in değirmeninde şunları söyledi: “Sözleşmeler C ++ 20'nin en etki özelliği olana kadar ve muhtemelen C ++ 11'den C ++ 'a eklediğimiz en etki özelliği. C ++ 26 ile muhtemelen sizi alacağız.
Bu makale P2961R2 teklifine dayanmaktadır.
Sözleşme nedir?
Bir sözleşme, yazılım bileşenleri için arayüzleri kesin ve doğrulanabilir bir şekilde belirler. Yazılımın bu bileşenleri, ön, koşullar ve değişmez olan işlevler ve yöntemlerdir. İşte tanımlar:
Size ilk örneği göstermeden önce, sözleşme tasarımının hedefleri hakkında bir şeyler yazmak istiyorum.
Tasarım Hedefleri
Aşağıdaki tasarım hedefleri İngilizce olarak tanımlanmıştır:
int f(int i)
pre (i >= 0)
post (r: r > 0)
{
contract_assert (i >= 0);
return i+1;
}
pre VEYA post
contract_assert
Sigorta için ideal anahtar kelime assertAncak contractttttt_asserrt yapmayın. assert Çoğu programlama dilinde sözleşme şikayetlerini ifade etmek için kullanılır. Ancak C ++ 'ın eski bir sorunu var.
#include <cassert>
void f() {
int i = get_i();
assert(i >= 0); // identical syntax for contract assert and macro assert!
use_i(i);
}
assert Zaten başlıklı bir makrocassert>.
Sözleşmenin ihlali
Sözleşme ihlal edilirse, bu çalışma zamanına göre bir hataya yol açar.
// contract.cpp
#include <iostream>
int f(int i)
pre (i >= 0)
post (r: r > 0)
{
contract_assert (i >= 0);
return i+1;
}
int main() {
std::cout << 'n';
f(-1);
std::cout << 'n';
}
Sırada ne var?
Bir sonraki makalemde, C ++ 26 çekirdekli dilinin daha küçük özellikleriyle ilgileneceğim.
(RME)
Yazılım Geliştirme: C ++ 26'daki sözleşmeler
C ++ 26'daki kısa yansımalardan sonra, şimdi sözleşmeler. Bu, işlevler için ön -sözleşmeler, koşullar yayınlama ve değişmez belirtmenizi sağlar.

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.

Sözleşmeler zaten C ++ 20'nin bir parçası olmalı, ancak standart koloni toplantısında kaldırılmıştır. Herb Sutter, Sutter'in değirmeninde şunları söyledi: “Sözleşmeler C ++ 20'nin en etki özelliği olana kadar ve muhtemelen C ++ 11'den C ++ 'a eklediğimiz en etki özelliği. C ++ 26 ile muhtemelen sizi alacağız.
Bu makale P2961R2 teklifine dayanmaktadır.
Sözleşme nedir?
Bir sözleşme, yazılım bileşenleri için arayüzleri kesin ve doğrulanabilir bir şekilde belirler. Yazılımın bu bileşenleri, ön, koşullar ve değişmez olan işlevler ve yöntemlerdir. İşte tanımlar:
- A İşlev öncesi: Bir işlevi girdiğinizde uygulanması gereken bir yüklem,
- A Posta: İşlevden ayrılırken uygulanması gereken bir yüklem,
- A İddia: Hesaplamadaki noktasına uygulanması gereken bir yüklem.
Size ilk örneği göstermeden önce, sözleşme tasarımının hedefleri hakkında bir şeyler yazmak istiyorum.
Tasarım Hedefleri
Aşağıdaki tasarım hedefleri İngilizce olarak tanımlanmıştır:
- Sözdizimi doğal olarak mevcut C ++ 'a uyum sağlamalıdır. Niyet, herhangi bir karışıklık yaratmadan sözleşmenin sözleşmeleri olmadan çok az kullanıcılar tarafından sezgisel olarak anlaşılabilir olmalıdır.
- Bir sözleşme kontrolü özelliklere, bir lambda veya önceden var olan başka bir C ++ yapısına benzememelidir. Hemen tanınan tasarım alanında oturmalı.
- Sözdizimi zarif ve hafif görünmelidir. Jetonları ve karakterleri gerekenden daha fazla kullanmamalıdır.
- Okunabilirliğe yardımcı olmak için sözdizimi, sözleşme kontrolünün farklı sözdizimsel taraflarını görsel olarak ayırmalıdır. Sözleşmeye dayalı çocuk, yüklem, dönüş değeri için adı … (Teklif P2961R2) bir bakışta bir bakışta ayırt edilmelidir)
int f(int i)
pre (i >= 0)
post (r: r > 0)
{
contract_assert (i >= 0);
return i+1;
}
pre VEYA post
- Bir ön veya posta koşulu ekleyin. Bir işlev, herhangi bir sayıda öncesi işlev ve direk -kümesine sahip olabilir. İstendiği gibi birlikte karıştırılabilirler.
- Bunlar, bağlama bağlı anahtar kelimeler veya belirli bağlamlarda bir anahtar kelimedir, ancak bu bağlamın dışında bir tanımlayıcıdır.
- İşlev beyanının sonunda konumlandırılırlar.
contract_assert
- Bu bir anahtar kelime. Aksi takdirde bir işlev çağrısından ayırt edilemez.
Sigorta için ideal anahtar kelime assertAncak contractttttt_asserrt yapmayın. assert Çoğu programlama dilinde sözleşme şikayetlerini ifade etmek için kullanılır. Ancak C ++ 'ın eski bir sorunu var.
#include <cassert>
void f() {
int i = get_i();
assert(i >= 0); // identical syntax for contract assert and macro assert!
use_i(i);
}
assert Zaten başlıklı bir makrocassert>.
Sözleşmenin ihlali
Sözleşme ihlal edilirse, bu çalışma zamanına göre bir hataya yol açar.
// contract.cpp
#include <iostream>
int f(int i)
pre (i >= 0)
post (r: r > 0)
{
contract_assert (i >= 0);
return i+1;
}
int main() {
std::cout << 'n';
f(-1);
std::cout << 'n';
}

Sırada ne var?
Bir sonraki makalemde, C ++ 26 çekirdekli dilinin daha küçük özellikleriyle ilgileneceğim.
(RME)