Svmmarivm
Hactenvs omne programma cvrsvs in vna plica continebatvr. Programma mille versvvm iam non vno tenore legitvr, et eivs fvnctiones digna svnt qvae aliis programmatibvs serviant. Haec lectio docet qvomodo dividatvr: capvt qvod declarat qvae modvlvs praebeat, plica implementationis qvae ea definit, et main.cpp qvae iis vtitvr. Cvstodias inclvsionis exhibet; regvlam vnivs definitionis, qvae dvos errores conivnctoris classicos et sensvm hodiernvm verbi inline explicat; compilationem separatam, qvae solvm id qvod mvtatvm est itervm compilat; et bibliotheca propria conclvditvr, ex fvnctionibvs lectionvm priorvm facta.
Proposita discendi
- Programma in capvt cvm declarationibvs, plicam implementationis et
main.cppdividere, et id compilare. - Cvstodias inclvsionis scribere et explicare qvam qvaestionem solvant;
#pragma onceagnoscere vt extensionem qvam omnes compilatores admittvnt, sed qvam norma non recipit. - Regvlam vnivs definitionis explicare et eivs violationes ex nvntio conivnctoris diagnoscere («
multiple definition», «undefined reference»). - Seorsvm compilare cvm
-cet obiecta conivngere, explicando qvid itervm compiletvr cvm qvaeqve plica mvtatvr.
Interfacies et implementatio
Modvlaritas
Fvnctio cvm pacto, vt eae lectionis Designare per fvnctiones, iam separat id qvod promittit, in declaratione et pacto svo scriptvm, ab eo qvomodo id praestet, in corpore svo scriptvm; qvi eam vocat solvm priore eget. Si hoc ita est, nihil prohibet qvominvs vtrvmqve membrvm in diversis plicis servetvr. Modvlvs est grex fvnctionvm (et genervm qvibvs vtvntvr) cvm proposito commvni; eivs interfacies est id qvod ei praebet qvi eo vtitvr, et eivs implementatio, modvs qvo id facit. In C++ interfacies in capite scribitvr (plica capitis, extensione .hpp, vel .h, a C hereditate accepta) et implementatio in plica .cpp eivsdem nominis.
Ex eo seqvvntvr tria commoda. Per membra intellegitvr: vt modvlo vtaris, satis est capvt eivs legere. Per membra compilatvr: mvtatio in implementatione non cogit eos itervm compilare qvi interfacie tantvm vtvntvr. Et per membra temptatvr, contra singvla pacta, vt lectio Temptare docebit. Cvrsvs LaTeX ad Scriptionem Academicam eodem modo docvmentvm longvm dividit, in lectione sva «Docvmenta longa».
Tres plicae
Modvlvs geometriae planae hvivs exempli tres fvnctiones praebet; dvae ex iis a lectione 5.3 venivnt. Capvt eas tantvm declarat, qvamqve cvm pacto svo. Tres versvs qvi a # incipivnt infra explicabvntvr; interim satis est scire omne capvt eos habere.
// geometry.hpp: interfacies modvli geometriae planae.#ifndef GEOMETRY_HPP#define GEOMETRY_HPP// Area circvli radio radius.// Praecondicio: radius >= 0.// Postcondicio: reddit aream circvli radio radius.double circleArea(double radius);// Vtrvm tres longitvdines latera triangvli sint.// Praecondicio: nvlla.// Postcondicio: reddit true si et solvm si exstat triangvlvm lateribvs a, b et c.bool isTriangle(double a, double b, double c);// Area triangvli lateribvs a, b et c.// Praecondicio: isTriangle(a, b, c).// Postcondicio: reddit aream triangvli lateribvs a, b et c (formvla Heronis).double triangleArea(double a, double b, double c);#endifPlica implementationis capvt svvm inclvdit et fvnctiones definit. Capita bibliothecae normalis qvibvs eget (<cmath> pro radice, <numbers> pro ) hic inclvdvntvr et non in capite, qvia qvi modvlo vtitvr iis non eget.
// geometry.cpp: implementatio modvli geometriae planae.#include "geometry.hpp"#include <cmath>#include <numbers>double circleArea(double radius){ return std::numbers::pi * radius * radius;}bool isTriangle(double a, double b, double c){ return a > 0 && b > 0 && c > 0 && a < b + c && b < a + c && c < a + b;}double triangleArea(double a, double b, double c){ const double s{(a + b + c) / 2}; return std::sqrt(s * (s - a) * (s - b) * (s - c));}Postremo main.cpp capvt inclvdit et modvlo vtitvr, ne vno qvidem versv implementationis eivs viso:
#include <print>#include "geometry.hpp"int main(){ std::println("Circvlvs radio 2: {:.4f}", circleArea(2.0)); std::println("Estne triangvlvm lateribvs 3, 4, 5? {}", isTriangle(3.0, 4.0, 5.0)); std::println("Area eivs: {}", triangleArea(3.0, 4.0, 5.0)); std::println("Et lateribvs 1, 2, 3? {}", isTriangle(1.0, 2.0, 3.0));}Circvlvs radio 2: 12.5664Estne triangvlvm lateribvs 3, 4, 5? trueArea eivs: 6Et lateribvs 1, 2, 3? falseSigna citationis in #include "geometry.hpp" plicam ante omnia in receptacvlo eivs plicae qvae eam inclvdit qvaervnt, angvli avtem in #include <print> in receptacvlis systematis: signa citationis plicis propriis servivnt. Plica geometry.cpp capvt svvm primo loco inclvdit, vt, si capiti inclvsio deesset qva ipsvm eget, error in modvlo compilando appareret et non in plica alterivs. Et triangvlvm lateribvs 1, 2 et 3 non exstat (), ita vt praecondicio fvnctionis triangleArea cogat id privs qvaerere.
Ad compilandvm mandatvm dvas plicas .cpp accipit; capvt non nominatvr, qvia in vtramqve per #include intrat. Optiones cvrsvs in variabili terminalis, FLAGS, servantvr, ne in omni mandato repetantvr; $FLAGS eas revocat. Sic scribitvr in Linux et macOS; in PowerShell variabiles alio modo scribvntvr, et praestat optiones integras scribere avt ab editore compilare (vide «Compilatio separata»).
$ FLAGS="-std=c++23 -Wall -Wextra -Wpedantic -Wconversion -Wshadow -g -fsanitize=address,undefined -fno-sanitize-recover=undefined"$ g++ $FLAGS main.cpp geometry.cpp -o main$ ./mainCircvlvs radio 2: 12.5664Estne triangvlvm lateribvs 3, 4, 5? trueArea eivs: 6Et lateribvs 1, 2, 3? falseFigvra eam lectionis Programmata, compilatores et C++ ad hoc opvs accommodat.
Demonstratio
Programmator tres plicas scribit: capvt et dvas plicas
.cpp. Solae plicae.cppcompilatori tradvntvr.Praeprocessor
geometry.hppin omnem plicam qvae id inclvdit transcribit. Svnt igitvr dvo exempla declarationvm, vnvm in qvaqve vnitate translationis, idqve rectvm est: fvnctio qvotiens libet declarari potest.Qvaeqve vnitas seorsvm in plicam obiecti svam compilatvr. Cvm
main.cppcompilatvr, compilatorgeometry.cppnon inspicit: declaratio ei svfficit ad genera cvivsqve vocationis confirmanda.Conivnctor dvo obiecta et bibliothecam normalem conivngit, et qvamqve vocationem plicae
main.oadcircleAreaper definitionem ingeometry.opositam resolvit.
Error freqvens est plicam implementationis inclvdere, #include "geometry.cpp". Si praeterea in mandato nominatvr, eivs fvnctiones bis definitae fivnt et conivnctio deficit, ex regvla qvam infra locvs «Regvla vnivs definitionis» explicabit; si non nominatvr, main.cpp rvrsvs fit textvs vnvs, qvi in omni mvtatione totvs itervm compilatvr. Plicae .cpp compilantvr; capita inclvdvntvr.
Argvmentvm oneratvr…