Proměnné definovány a přiřazeny zároveň

hlasů
0

Prezentace Kódovací styl, který jsem se zúčastnil v kanceláři v poslední době obhajoval, že proměnné by neměl být přiřazen (výchozí hodnotu), když jsou definovány. Místo toho by měli být přiřazena výchozí hodnotu těsně před jejich použitím. Takže něco jako

int a = 0;

měl být odsuzován.

Je zřejmé, že příklad ‚int‘ je zjednodušující, ale stejný následuje u ostatních typů také jako ukazatele atd

Dále bylo rovněž uvedeno, že kompatibilní překladač C99 nyní vyzvracet varování ve výše uvedeném případě.

Výše uvedený postup vypadá užitečné pro mě jen struktury, tj jim memset pouze před použitím. To by být efektivní, pokud je použita struktura (nebo plněné) pouze v chybové noze.

Ve všech ostatních případech, zjistil jsem, definování a přiřazení na výchozí hodnotu obezřetný výkon, jak jsem narazil na spoustu chyb, protože ukazatele un-inicializován jak při psaní a udržování kódu. Dále se domnívám, C ++ pomocí konstruktérů také prosazuje stejný přístup, tj definovat a přiřadit.

Já jsem přemýšlel, proč se (je-li) standard C99 nemá rád definování a přidělení. Je jejich jakýkoli značné zásluhy na tom, co prezentace kódování styl obhajoval?

Položena 11/06/2009 v 06:24
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
0

Tak nějak jsem se shodují s doporučením, i když si nejsem úplně jistý standard říká něco o tom, a já velmi pochybuji bit o varování kompilátoru, je pravda.

Jde o to, moderní kompilátory a může se detekovat používání zovaných proměnných. Pokud nastavíte proměnné na výchozí hodnoty při inicializaci, ztratíte, že detekce. A výchozí hodnoty mohou způsobovat chyby příliš; jistě v případě vašeho příkladu int a = 0;. Kdo říká, že 0je vhodná hodnota pro a?

V roce 1990, rada by to bylo špatné. V dnešní době, to je v pořádku.

Odpovězeno 11/06/2009 v 06:34
zdroj uživatelem

hlasů
0

Připadá mi to velmi užitečné předem přiřadit nějaké implicitní data proměnných, takže nemám dělat (tolik) null kontrol v kódu.

Odpovězeno 11/06/2009 v 06:35
zdroj uživatelem

hlasů
1

Tam žádný takový požadavek (či dokonce pokyn, že jsem si vědom) v C99, ani dělá kompilátor vás varovat. Je to jen otázka stylu.

Pokud jde o kódování styl, myslím, že se věci příliš doslovně. Například vaše tvrzení je hned v následující věci ...

int i = 0;

for (; i < n; i++)
        do_something(i);

... nebo dokonce v ...

int i = 1;

[some code follows here]

while (i < a)
        do_something(i);

... ale existují i ​​jiné případy, které v mé mysli, jsou lépe zacházet s časný „deklarovat a přiřadit“. Vezměme konstrukce ze na zásobníku nebo různé OOP konstrukty, jako v:

struct foo {
        int bar;

        void *private;
};

int my_callback(struct foo *foo)
{
        struct my_struct *my_struct = foo->private;

        [do something with my_struct]

        return 0;
}

Nebo jako v (C99 struct Inicializátory):

void do_something(int a, int b, int c)
{
        struct foo foo = {
                .a        = a,
                .b        = b + 1,
                .c        = c / 2,
        };

        write_foo(&foo);
}
Odpovězeno 11/06/2009 v 07:25
zdroj uživatelem

hlasů
0

Viděl jsem tolik chyb kvůli neinicializované ukazatelů, které jsem vždy obhajoval deklarovat každou proměnnou NULL_PTR a každý primitivewith nějakou neplatnou / výchozí hodnotu.

Vzhledem k tomu, pracuji na RTOS a vysoký výkon, ale systémy nízkých prostředků, je možné, že kompilátory používáme nezachytily non-inicializovat je s nimi nakládáno. I když pochybuji, moderní kompilátory mohou být také spoléhal na 100%.

Ve velkých projektech, kde se ve velké míře používají makra, viděl jsem vzácné scénářů, kde dokonce Kloclwork / Purify nedokázala najít non-inicializovat je s nimi nakládáno.

Tak říkám držet s ním tak dlouho, dokud používáte starý dobrý C / C ++.

Moderní jazyky jako .Net nemůže zaručit inicializovat varaibles, nebo dát chyba kompilátoru pro neinicializovanou variabilní použití. Následující odkaz dělá analýzu výkonnosti a potvrzuje, že je výkon 10-20% hit for .NET. Analýza je v poměrně detailně vysvětlen také.

http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx

Odpovězeno 11/06/2009 v 07:58
zdroj uživatelem

hlasů
1

Obvykle bych doporučil inicializaci proměnné, pokud jsou definovány, pokud je známo, hodnota by měla mít a nechat proměnné zovaných v případě, že hodnota není. Ať tak či onak, dát jim co nejblíže k jejich použití jako scopingu pravidla umožňují.

Místo toho by měli být přiřazena výchozí hodnotu těsně před jejich použitím.

Obvykle byste neměli používat výchozí hodnotu vůbec. V C99 můžete kombinovat kód a deklarace, takže není žádný bod, definující proměnnou před přiřadit hodnotu. Pokud znáte hodnotu to má vzít, pak je v tom, že výchozí hodnotu nemá smysl.

Dále bylo rovněž uvedeno, že kompatibilní překladač C99 nyní vyzvracet varování ve výše uvedeném případě.

Ne pro případ, že budete ukázat - nechcete dostat varování pro mít int x = 0;. Mám silné podezření, že někdo dostal to popletl. Kompilátory varují, pokud používáte proměnné bez přiřazení hodnoty k němu, a pokud máte:

... some code ...

int x;

if ( a )
    x = 1;
else if ( b )
    x = 2;
// oops, forgot the last case else x = 3;

return x * y;

pak dostanete varování, že x může být použita, aniž by byl zahajován alespoň gcc.

Nebudete mít varování, pokud přiřadíte hodnotu xpřed if, ale to není podstatné, zda je přiřazení se provádí jako initialiser nebo jako samostatná prohlášení.

Pokud nemáte zvláštní důvod pro přiřazení hodnoty dvakrát dvou větví, nemá smysl přiřadí výchozí hodnotu x jako první, protože se zastaví kompilátor varuje vám, že jste se vztahuje každou větev.

Odpovězeno 19/06/2009 v 15:07
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more