Ar #pragma kartą priklauso C ++ 11 standartui?

Tradiciškai standartinis ir nešiojamas būdas išvengti kelių #ifndef - #define - #endif į C ++ buvo naudoti #ifndef - #define - #endif prieš sudarytojo direktyvos schemą, dar vadinamą makro apsaugos schema (žr. Toliau pateiktą kodo fragmentą).

 #ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif 

Tačiau daugumoje diegimų ir (arba) kompiliatorių (žr. Toliau pateiktą paveikslą) yra „grakštesnė“ alternatyva, kuri tinka tam pačiam tikslui kaip ir #pragma once makro apsaugos schema. #pragma once turi keletą privalumų, palyginti su makroblokų schema, įskaitant mažesnį kodą, vengiant pavadinimų konfliktų ir kartais pagerintą kompiliavimo greitį.

2019

112
16 мая '14 в 16:20 2014-05-16 16:20 yra nustatytas 101010 gegužės 16, 14, 20 val. 2014-05-16 16:20
@ 2 atsakymai

#pragma once nėra standartinis. Tai plačiai paplitęs (bet ne universalus) plėtinys, kurį galima naudoti.

  • Jei jūsų perkėlimo problemos yra ribotos, ir
  • Galite būti tikri, kad visi jūsų įtraukti failai visada yra jūsų vietiniame diske.

Jis buvo svarstomas standartizuoti, tačiau buvo atmestas, nes jo negalima patikimai įgyvendinti. (Problemos kyla, kai pasiekiate failus per kelis skirtingus nuotolinius įrenginius.)

Tai gana paprasta įsitikinti, kad konflikte nėra jokio gynėjo. Bibliotekoms, kurias gali naudoti daug skirtingų dizainų, akivaizdus sprendimas yra sukurti daug atsitiktinių simbolių įtrauktam apsaugui, kai jį sukuriate. (Jūs galite sukurti gerą redaktorių, kad tai padarytumėte, kai atidarote naują antraštę.) Bet net ir be to, aš dar nesusidūriau su konfliktais tarp bibliotekų.

79
16 мая '14 в 19:08 2014-05-16 19:08 Atsakymą davė James Kanze gegužės 16 d., 14:08 2014-05-16 19:08

Standarto 16.6 skirsnis ( N3936 aprašo #pragma #pragma kaip:

Išankstinė direktyva

 # pragma pp-tokensopt new-line 

sukelia įgyvendinimą tam tikru būdu. Elgesys gali sukelti vertimo klaidą arba sukelti vertėjo ar gautos programos elgesį netinkamai. Nepaisoma jokios neįgyvendinimo pragmos.

Iš esmės #pragma once yra konkretus #pragma pavyzdys, kuris yra konkretus įgyvendinimui, ir ne, jis nėra standartinis. Visi vienodi.

Jį dažnai palaiko dauguma „pagrindinių kompiliatorių“, įskaitant GCC ir C> . todėl kartais rekomenduojama vengti kontrolės plokštės įtraukimo.

16 мая '14 в 16:22 2014-05-16 16:22 atsakymas duotas batų gegužės 16 d. 14 val. 16:22 2014-05-16 16:22