Portál AbcLinuxu, 30. dubna 2025 10:46
2. ledna 2014 byla vydána nová verze 3.4 překladačové infrastruktury LLVM a překladače jazyků rodiny C clang. Mezi hlavní novinky patří plná podpora clangu pro nadcházející C++14, výrazné vylepšení statického analyzátoru kódu při analýze C++ kódu, nový nástroj clang-format pro formátování zdrojových kódů dle uživatelem specifikovaných standardů (využívající knihoven clangu), clang driver s command-line syntaxí kompatibilní s MSVC, lepší diagnostika, lepší optimalizace a další. Více informací je v Release Notes pro clang a LLVM.
Tiskni
Sdílej:
template<typename T> [](T bla, T bla2) -> decltype(T+T) {}
by bylo hezčí static
, taky v každém kontextu něco úplně jinýho, a přesto si nikdo nestěžuje
//.... include stdio.h a time.h
time_t * myTime(void)
{
//static \
time_t cas;
cas=time(NULL);
return (&cas);
}
int main(void)
{
printf("prave je: %d:%d:%d\t\t%d.%d.%d \n", localtime(myTime())->tm_hour, \
localtime(myTime())->tm_min, localtime(myTime())->tm_sec,\
localtime(myTime())->tm_mday, 1+(localtime(myTime())->tm_mon), \
1900+(localtime(myTime())->tm_year));
}
Realne by som cakal pad vzdy.To zalezi na tom, jestli jste u nejaky pouzil stack protector nebo address sanitiser, obecne nejaka ocharna stacku krome buffer overflow se nedela.
static non-member funkce,To je ale uplne neco jineho nez ostatni dva priklady, v C je to jasne, C++03 je to bylo deprecated a v C++11 to soudruzi planovaci opet un-deprecated.
template <bool condition, typename if_true, typename if_false> struct static_if; template <typename if_true, typename if_false> struct static_if<true, if_true, if_false> { using result = if_true; }; template <typename if_true, typename if_false> struct static_if<false if_true, if_false> { using result = if_false; };
Já doufám, že přibude ještě "static if". To by pro ten bordel v šablonách byla docela užitečná věc.V C++14 mohou
constexpr
funkce obsahovat if.
static
se to alokuje na zásobníku, takže ten ukazatel pořád ukazuje na platnou paměť. Akorát to bude velmi rychle obsahovat nesmysly.
Už od začátku je v C++ slůvkoJak, pokaždé něco jiného? Kdy to znamená něco jiného než "globální proměnná/funkce s omezenou viditelností" ?static
, taky v každém kontextu něco úplně jinýho, a přesto si nikdo nestěžuje![]()
static void funkce() // Jeden význam { static int hodnota = 1; // Druhý význam } class Class { static void funkce() // Třetí význam {} };
Protože static neznamená a nikdy neznamenal, že nějaký identifikátor je ukryt v modulu – příští norma C++ vás třeba může nemile překvapit. Znovu: klíčové slovo static v C++ (na tozdíl od C) nebyl, není a nikdy nebude určeno pro ukrývání identifikátorů. A touto logikou půjdou i příští normy C++.Tvurci C++ standardu by s tebou asi nesouhlasili. Termin "internal linkage" je celkem vystizny.
A name is said to have linkage when it might denote the same object, reference, function, type, template, namespace or value as a name introduced by a declaration in another scope:----------
— When a name has external linkage, the entity it denotes can be referred to by names from scopes of other translation units or from other scopes of the same translation unit.
— When a name has internal linkage, the entity it denotes can be referred to by names from other scopes in the same translation unit.
— When a name has no linkage, the entity it denotes cannot be referred to by names from other scopes.
A name having namespace scope (3.3.6) has internal linkage if it is the name of
— a variable, function or function template that is explicitly declared static; or,
Není naprosto žádný problém pochopit celé C++S tim se da souhlasit
static
prvního případu (having namespace scope), tak to má internal linkage, což znamená, že se na to dá jménem odkazovat jen z té translation unit (*.cpp plus všechny includy), kde to bylo definované.
Stále je to jeden a ten samý význam.Nema. Jena vec je storage class specifier a druha linkage specifier; v obou pripadech jde o rozdilne veci.
Není naprosto žádný problém pochopit celé C++ v tom co umí, protože je logické a má vnitřní konzistenci na rozdíl od většiny jiných jazyků.Co si mam tvrdsiho zobnout nez otevru C++ standard, abych mel stejne optimisticky pocit?
static int a = 3
rozhodně není konstanta a kompilátor ji tak nemůže použít. Muselo by to být static const int a = 3
. Jenže kompilátor to jako konstantu může použít, i pokud tam ten static
vůbec není, ten se v tomto případě používá jen pro členské proměnné nebo pro specifikaci internal linkage.
static void funkce() // Globální funkce s viditelností omezenou na jednu kompilační jednotku (soubor) { static int hodnota = 1; // Globální proměnná s viditelností omezenou na funkci } class Class { static void funkce() // Globální funkce s viditelností omezenou na třídu (mimo je potřeba explicitní kvalifikace) {} };
které jsou ve skutečnosti velmi konzistentní a logické, jen co je člověk dostane správně vysvětlenéMuhehe.
Podobně je to se statickou proměnnou 'b' ve třídě 'C', jako 'b' se na ni dá odkázat jen z 'C'. V tomhle případě akorát jde explicitní kvalifikací 'C::b' odkázat i zvenku.To, že ta funkce/proměnná je ve tříde C viditelná jako b je dáno pouze tím, že v rámci scope/namespace člověk nemusí uvádět plné jméno. Jinak ale 'skutečné' jméno té funkce/proměnné je třeba
::foo::bar::C::b
, kde foo
a bar
jsou třeba namespaces (mohly by to být ale i třídy). To, že z různých míst se můžu na tu funkci odkazovat například jménem b
nebo C::b
nebo bar::C::b
je dáno pravidly, jakými se lokalizuje identifikátor, s viditelností to nemá vůbec nic společného.
No, u C++11 jsem si říkal, že ten jazyk není až tak moc složitej, když si někdo stěžoval. Právě nám ale vyrostla konkurence Perlu. Tohle je docela síla.Co je na tom spatnyho? A co je spatnyho na Perlu??
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.