- wachag blogja
- A hozzászóláshoz be kell jelentkezni
- 2421 megtekintés
Hozzászólások
Marmint arra a forditora gondolsz, ami 2012 szeptembereben jelent meg? Ne hasonlitsuk a sokkal gyorsabb kiadasi ciklusu FOSS compilerekhez.
A VS2013 mar jobban all, de az igazi target a C++14 lesz.
http://www.infoq.com/news/2013/07/vs2013_CPP_compliance
- A hozzászóláshoz be kell jelentkezni
Voltak update-ek azóta. De eléggé alap dolgok nincsenek benne.
És végülis... a C99 óta is csak tizennégy év telt el :-(
- A hozzászóláshoz be kell jelentkezni
barmilyen meglepo, de a visual c++ egy c++ fordito!
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Igazából C és C++ :)
- A hozzászóláshoz be kell jelentkezni
Ld. lentebb, vsnprintf és társai.
Az is meglepő, hogy egy ilyet nem fordít le:
#include <stdio.h>
int main(int argc,char* argv[]){
int a=5;; // két pontosvessző!
int b=1;
printf("%d\n",a+b);
return 0;
}
Mégpedig a következőképpen nem teszi ezt meg, így reprodukálható:
Létrehozol egy új projektet (empty console application).
Létrehozol egy üres text file-t, hozzáadod a fentebbi kódot, elmented valami.c néven (.c kiterjesztés), majd hozzáadod a projekthez (add existing). (szerk: ha létrehozol egy új .cpp forrásfilet .c kiterjesztéssel, akkor is ok. A lényeg, hogy üres projektből indulj).
Az általam kapott hibaüzenet:
1>------ Build started: Project: ConsoleApplication3, Configuration: Debug Win32 ------
1> main.c
1>c:\users\wachag\documents\visual studio 2012\projects\consoleapplication3\consoleapplication3\main.c(5): error C2143: syntax error : missing ';' before 'type'
1>c:\users\wachag\documents\visual studio 2012\projects\consoleapplication3\consoleapplication3\main.c(6): error C2065: 'b' : undeclared identifier
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Eltávolítva a ;-t az int a=5;; legvégéről rögtön fordul.
A kód, amit írtam valid C++, viszont - ha jól láttam, C-ben csak a C99 szabvány támogatja.
A kérdésem: ha a Visual C++ C++ fordító, miért hibás a fenti kód? Mert nem C++ fordítóval fordította, hanem a régebbi C szabvány szerint.
Szerk: tegnap erre is ráfutottam, onnan tudok róla.
- A hozzászóláshoz be kell jelentkezni
A fájlneved main.c, ami ránézésre egy C forrásfájl. Ezért nyilván C kódként fordítja. Esetleg a C99-et külön kell beállítani.
- A hozzászóláshoz be kell jelentkezni
Tudom, ld. lentebb és fentebb, Replaced állítására hoztam az ellenpéldát.
C99 támogatás nincs.
- A hozzászóláshoz be kell jelentkezni
Code Generation-t állítsd be C++-ra, és próbáld úgy. Persze valóban nonszensz .c fájlba írni C++ kódot, de ez már mellékes.
- A hozzászóláshoz be kell jelentkezni
Tudom. Csak fentebb nyilatkoztak, hogy a Visual C++ C++ fordító. Erre hoztam ellenpéldát. C és C++ fordító is.
- A hozzászóláshoz be kell jelentkezni
Ez mind rendben van, de vannak sajnos más problémák is. Egy példa:
vsnprintf - MSDN
vsnprintf - cplusplus.com
Ha megnézed, teljesen máshogy van specifikálva a függvény visszatérési értéke a két helyen:
vsnprintf, _vsnprintf, and _vsnwprintf return the number of characters written if the number of characters to write is less than or equal to count; if the number of characters to write is greater than count, these functions return -1 indicating that output has been truncated. The return value does not include the terminating null, if one is written.
vs.
The number of characters that would have been written if n had been sufficiently large, not counting the terminating null character.
- A hozzászóláshoz be kell jelentkezni
Amit linkeltel: Visual Studio 2005-hoz tartozo leiras.
A masik leiras meg a C++11 szabvany resze.
Nehogymar egy 8 eves fordito es runtime tudja a 2 eves szabvanyt. Az idoutazas meg a Microsofttol sem elvarhato.
Ez egy tipikus nevutkozesi hiba. Az MS implementalt valamit X eve, a szabvany kesobb meg ugyanilyen neven valami mast definialt. Az MS hibaja, hogy nem tudott sok-sok evre elore gondolkodni? Na ne mar!
- A hozzászóláshoz be kell jelentkezni
A 2012-es dokumentációja is pontosan ugyan úgy definiálja a visszatérési értéket. A vsnprintf függvény pedig a standard C99 könyvtár része, tehát nem a két évvel ezelőtti C++11 szabvány specifikálta először. Arra pedig lehetett számítani, hogy a C99 újdonságai bekerülnek majd a következő C++ szabványba, bármikor legyen is az elfogadva. Azt nem tudom, hogy lehetne kideríteni, hogy a Microsoft verziója mikor lett definiálva, de 2000-ben már elfogadták a C99 szabványt.
- A hozzászóláshoz be kell jelentkezni
A visszafele kompatibilitás meg le van szarva, mi? Az is elvárható, hogy az a kód, ami a visual studio 2005-tel fordult, az a visual studio 2012-vel is ugyanúgy forduljon és ugyanazt csinálja. Az egyetlen megoldás, hogy valahogy (pl. #define, vagy fordító opció) lehessen befolyásolni a viselkedését, és akkor már csak azt kell eldönteni, hogy melyik legyen a default.
- A hozzászóláshoz be kell jelentkezni
És lehet?
- A hozzászóláshoz be kell jelentkezni
A Visual C++ meg mindig egy C++ fordito es a runtimeja is C++ runtime. A C++ szabvanyok kozul pedig a C++11 resze a vsnprintf.
- A hozzászóláshoz be kell jelentkezni
Ezt én megértem. Csak az a baj, hogy utánanéztem, és a Visual Studio 6.0 még csak a _vsnprintf függvényt támogatta, tehát az aláhúzásjel-mentesített verzió vélhetően a C99 elfogadása után került be. És ha ez így van, akkor teljességgel érthetetlen, hogy miért implementáltak a specifikációval ütköző módon egy olyan függvényt, amelyről tudták, hogy gyakorlatilag biztosan a következő C++ szabvány része lesz.
- A hozzászóláshoz be kell jelentkezni
"Microsoft Visual C++ (often abbreviated as MSVC or VC++) is a commercial (free version available), integrated development environment (IDE) product from Microsoft for the C, C++, and C++/CLI programming languages."
Szerintem nem. Es a VC++ -hoz csak egy darab compilert adnak, tehat nincs olyan, mint a gcc-nel, hogy a gcc C compiler, a g++ meg C++ compiler. Elvben kutyakotelessege lenne mind a C mind a C++ szabvanyoknak megfelelni. Az, hogy nem felel meg, az nem a szabvanyok hibaja. IMHO.
Azt mar csak halkan emlitem meg, hogy a vsnprintf az a POSIX API layernek is resze, tehat ahhoz mindenkepp konformnak kellene lennie. Szerintem lenyegtelen, hogy melyik C++ szabvany definialja, mert a POSIX API definialja, es a nyelvi kulonbseg nem okozhat mukodesbeli elterest.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
"Szerintem nem. Es a VC++ -hoz csak egy darab compilert adnak, tehat nincs olyan, mint a gcc-nel, hogy a gcc C compiler, a g++ meg C++ compiler. Elvben kutyakotelessege lenne mind a C mind a C++ szabvanyoknak megfelelni. Az, hogy nem felel meg, az nem a szabvanyok hibaja. IMHO."
Az előbb már elmagyarázták, hogy névütközés miatt van a gond. Melyik részét nem érted?
"Azt mar csak halkan emlitem meg, hogy a vsnprintf az a POSIX API layernek is resze, tehat ahhoz mindenkepp konformnak kellene lennie. Szerintem lenyegtelen, hogy melyik C++ szabvany definialja, mert a POSIX API definialja, es a nyelvi kulonbseg nem okozhat mukodesbeli elterest."
Nettó hülyeség. Már miért kéne a win32 C-nek implementálnia a POSIX-et? Semmi köze hozzá. C fordító, nem POSIX fordító. Ennyi erővel a gecicének is implementálnia kéne a win32-t.
- A hozzászóláshoz be kell jelentkezni
Ez egyébként téged hogyan akadályoz téged érdemben a fejlesztésben?
- A hozzászóláshoz be kell jelentkezni
Pl. úgy, hogy C++11-et kihasználó kódot kellett visszaportolnom, hogy működjön Visual Studioval. Nem jó móka.
- A hozzászóláshoz be kell jelentkezni
Tehát szarul/sehogy terveztétek meg a fejlesztést.
- A hozzászóláshoz be kell jelentkezni
(halottidézés)
Vagy nem botokat és köveket szeretnénk használni a fejlesztéshez.
- A hozzászóláshoz be kell jelentkezni
Ez csak a trey-bviktor újrabootolásos vitához jutott eszembe, most rakom fel az Update 3-at, ezt írta ki:
Please close Visual Studio now to reduce the chance that a computer restart will be required later.
"reduce the chance"... ilyet leírni szerintem kicsit igénytelen :-).
Szerk: reduced chance ellenére is újra kellett indítani sajna, hiába, mint tudjuk, a reduced nem jelenti, hogy nem fog bekövetkezni :-(.
- A hozzászóláshoz be kell jelentkezni
Újraboolásos vitához annyit, hogy mi a fasznak kell Windowson egy felhasználói program telepítése után reboot? Minek kell egy Hyper-V role telepítése után reboot egy _szerveren_? Mi ez, a középkor? Továbbá, Windows Update-et miért kell 123 szakaszban megcsinálni?
"Találtam 123 frissítést."
<reboot>
"Megint találtam 12 frissítést"
<reboot>
"Már megint találtam 3 frissítést"
<reboot>
Fogadjunk, hogy megint találtál frissítést, a k. anyádat.
<egy ideig semmi>
<öt perc múlva>
"Megint találtam 4 frissítést"
<reboot>
--
trey @ gépház
- A hozzászóláshoz be kell jelentkezni
Pl. mivel teljesen máshogy kezelik a futtathatókat/dinamikus library-kat, azért. Tölts be egy exét, aztán próbáld meg kitörölni. Aztán tölts be egy bint Linuxon, és próbáld meg ugyanezt. Ezek után talán rájössz a kurva nagy rejtély megoldására.
Ha egy program betölt egy rendszer DLL-t, akkor azt hogy a picsába frissíted, hm? Bármelyik program ráülhet, bármelyik a több millió közül, amit valaha írtak Windows-ra. A Windows hogyan garantálja neked, hogy nem lesz ilyen? Vajon miért írja ki sok telepítő, hogy léccine használj más programot a telepítés alatt? :)
Amikor pedig mondjuk IE frissítés emiatt csak újraindítás után tudja a helyére tenni a DLL-t, nyilván csak az újraindítás után fog tudni ehhez a DLL-hez további frissítéseket telepíteni. Bizonyára meg lehetne ezeket a problémákat kerülni, de triviálisnak semmiképp nem nevezném.
- A hozzászóláshoz be kell jelentkezni
posix rendszereken voluntary file locking van, windowson mandatory, mindegyiknek van elonye hatranya
hozzajon meg az, hogy a klasszikus unix rendszeren a kitorolt fajl inodeja megmarad amig nyitva van
viszont ha van egy linux programod, legyen 'server', ami linkelve van libserver.so.1-hez es frissited libserver.so.2-re,
de nem inditod ujra 'server', akkor a regit fogja hasznalni, mi akkor eleg gaz, ha eppen egy vulnerability miatt
volt a frissites
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Ez mind világos, de most arra kell fapolni, hogy nem kér újraindítást így 2013-ban! Az nem baj, hogy a frissítés nem lépett érvénybe, a lényeg, hogy azt a látszatot keltse! A biztonság, megbízhatóság, determináltság mellékes. (according to trey)
- A hozzászóláshoz be kell jelentkezni
Jah megbízhatóság, biztonság és a Windows Update. Persze.. Ha valami miatt - mondjuk áramszünet - beragad a WU folyamatba egy frissítés akkor jöhet a szívás, a registry túrás és a görcsölés. Pont így jártam, de mást se tud mondani ez a szar mint 0x800ffff, amire az MS in-place-upgrade -et javasol. Ráadásul a Vista óta ismert a probléma, de mégis csak előjött 2008R2-es szerverben.
Hihetetlen, hogy mennyivel korszerűbb mint egy apt-get install -f vagy dpkg-reconfigure -a
- A hozzászóláshoz be kell jelentkezni
Áramszünet vs. szerver. Több mondanivalóm nincs.
- A hozzászóláshoz be kell jelentkezni
Olyan jól rosszul tudod csavarni a dolgokat, hogy az hihetetlen. :) Már a múltkor is elmesélték neked, hogy mi a probléma, de még most sem érted.
--
trey @ gépház
- A hozzászóláshoz be kell jelentkezni
Az a gond, hogy lábrázást kapsz az újraindításoktól, és szerinted ennek minden más technikai szempontot alá kéne rendelni.
- A hozzászóláshoz be kell jelentkezni
Ezert szokjak a csomagkezelok egy resze automatikusan restartolni is a 'server-server' szolgaltatast. Nem a gepet, a szolgaltatast.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
libc-nel mit restartolsz?
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Minek kell egy Hyper-V role telepítése után reboot
érthetetlen!
- A hozzászóláshoz be kell jelentkezni
Hozzáfűzném, hogy maga az IDE az tényleg nagyon jó (bár elsősorban Eclipse-t használok). Csak ez kicsit szépséghiba számomra.
- A hozzászóláshoz be kell jelentkezni
Eclipse-nél bármi jobb ;)
- A hozzászóláshoz be kell jelentkezni
Én szeretem használni ;)
- A hozzászóláshoz be kell jelentkezni
Mindenkinek megvan a maga perverziója :)
- A hozzászóláshoz be kell jelentkezni