Jakie są Twoje ulubione idiomy stylu kodowania C++ [zamknięte]

Jakie są Twoje ulubione idiomy w stylu C++? Pytam o styl lub typografię kodowania np. gdzie wstawiasz nawiasy klamrowe, czy są spacje po słowach kluczowych, wielkość wcięć itp. Jest to sprzeczne z najlepszymi praktykami lub wymaganiami, takimi jak zawsze usuwanie tablic za pomocą delete[].

Oto przykład jednego z moich ulubionych: w inicjalizatorach klasy C++ umieszczamy separatory z przodu linii, a nie z tyłu. Dzięki temu łatwiej jest to aktualizować. Informatyka oznacza to również, że różnice w kontroli kodu źródłowego między wersjami są czystsze.

TextFileProcessor::
TextFileProcessor( class ConstStringFinder& theConstStringFinder ) 

    : TextFileProcessor_Base( theConstStringFinder )

    , m_ThreadHandle  ( NULL )
    , m_startNLSearch (    0 )
    , m_endNLSearch   (    0 )
    , m_LineEndGetIdx (    0 )
    , m_LineEndPutIdx (    0 )
    , m_LineEnds      ( new const void*[ sc_LineEndSize ] )
{
    ;
}
Author: Foredecker, 2008-11-09

24 answers

Podczas tworzenia wyliczeń umieść je w przestrzeni nazw, aby uzyskać do nich dostęp z wymowną nazwą:

namespace EntityType {
    enum Enum {
        Ground = 0,
        Human,
        Aerial,
        Total
    };
}

void foo(EntityType::Enum entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}

EDIT: jednak technika ta stała się przestarzała w C++11. wyliczanie zakresów (deklarowane przez enum class lub enum struct) powinno być stosowane zamiast: jest bardziej bezpieczne dla typu, zwięzłe i elastyczne. W przypadku wyliczeń w starym stylu wartości są umieszczane w zewnętrznym zakresie. W Nowym Stylu są one umieszczane w zakresie nazwy enum class.
Poprzedni przykład przepisany przy użyciu wyliczania zakresowego (znanego również jako silnie wpisanego wyliczenia):

enum class EntityType {
    Ground = 0,
    Human,
    Aerial,
    Total
};

void foo(EntityType entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}

Istnieją inne znaczące korzyści płynące z używania wyliczeń scoped: brak ukrytych rzutów, możliwa deklaracja forward I możliwość użycia niestandardowego typu bazowego (nie domyślnego int).

 55
Author: kshahar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-17 22:54:46

RAII: Resource Acquisition Is Initialization

RAII może być najważniejszym idiomem. Chodzi o to, że zasoby powinny być mapowane do obiektów, tak aby ich żywotność była zarządzana automatycznie zgodnie z zakresem, w którym obiekty te są deklarowane.

Na przykład, jeśli na stosie został zadeklarowany uchwyt pliku, powinien on być niejawnie zamknięty po powrocie z funkcji(lub pętli, lub dowolnego zakresu, w którym został zadeklarowany). Jeśli dynamiczna alokacja pamięci była przydzielany jako członek klasy, powinien być niejawnie uwolniony, gdy ta instancja klasy zostanie zniszczona. I tak dalej. Każdy rodzaj zasobu-alokacje pamięci, uchwyty plików, połączenia z bazą danych, gniazda i każdy inny rodzaj zasobu, który ma zostać pozyskany i zwolniony-powinien być zawinięty w taką klasę RAII, której żywotność zależy od zakresu, w którym został zadeklarowany.

Jedną z głównych zalet tego jest to, że C++ gwarantuje wywoływanie destruktorów, gdy obiekt wychodzi z scope, niezależnie od tego, jak kontrola opuszcza ten scope . Nawet jeśli zostanie wyrzucony wyjątek, wszystkie lokalne obiekty wyjdą poza zakres, a więc ich powiązane zasoby zostaną wyczyszczone.

void foo() {
  std::fstream file("bar.txt"); // open a file "bar.txt"
  if (rand() % 2) {
    // if this exception is thrown, we leave the function, and so
    // file's destructor is called, which closes the file handle.
    throw std::exception();
  }
  // if the exception is not called, we leave the function normally, and so
  // again, file's destructor is called, which closes the file handle.
}

Niezależnie od tego, jak opuścimy funkcję i co się stanie po otwarciu pliku, nie musimy jawnie zamykać Pliku ani obsługiwać WYJĄTKÓW (np. try-finally) wewnątrz tej funkcji. Zamiast tego plik zostanie wyczyszczony, ponieważ jest powiązany z lokalnym obiektem, który zostanie zniszczony kiedy wyjdzie poza zasięg.

RAII jest również mniej znane jako Sbrm (Scope-Bound Resource Management).

Zobacz też:

  • ScopeGuard pozwala kodowi "automatycznie wywoływać operację cofania".. w przypadku wyrzucenia wyjątku."
 61
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 20:03:29

Copy-swap

Idiom copy-swap zapewnia bezpieczne kopiowanie WYJĄTKÓW. Wymaga to zaimplementowania poprawnej kopii ctor i swap.

struct String {
  String(String const& other);

  String& operator=(String copy) { // passed by value
    copy.swap(*this); // nothrow swap
    return *this; // old resources now in copy, released in its dtor
  }

  void swap(String& other) throw() {
    using std::swap; // enable ADL, defaulting to std::swap
    swap(data_members, other.data_members);
  }

private:
  Various data_members;
};
void swap(String& a, String& b) { // provide non-member for ADL
  a.swap(b);
}

Można również zaimplementować metodę swap za pomocą ADL (Argument Dependent Lookup) bezpośrednio .

Ten idiom jest ważny, ponieważ zajmuje się samo-przypisywaniem[1], daje gwarancję silnego wyjątku[2], i często jest bardzo łatwy do napisania.


[1] nawet jeśli samo zadanie nie jest obchodzić się tak sprawnie, jak to tylko możliwe, to powinno być rzadkie , więc jeśli to się nigdy nie stanie, to tak naprawdę jest szybciej.

[2] jeśli jakikolwiek wyjątek zostanie wyrzucony, stan obiektu (*this) nie zostanie zmodyfikowany.

 33
Author: 4 revs, 2 users 52%Roger Pate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:01

CRTP: ciekawie powtarzający się wzór szablonu

CRTP dzieje się, gdy przekazujesz klasę jako parametr szablonu do jej klasy bazowej:

template<class Derived>
struct BaseCRTP {};

struct Example : BaseCRTP<Example> {};

W obrębie klasy bazowej, może uzyskać pochodną instancję, wraz z typem pochodnym , po prostu przez odlewanie (albo static_cast lub dynamic_cast ):

template<class Derived>
struct BaseCRTP {
  void call_foo() {
    Derived& self = *static_cast<Derived*>(this);
    self.foo();
  }
};

struct Example : BaseCRTP<Example> {
  void foo() { cout << "foo()\n"; }
};

W efekcie, call_foo zostało wstrzyknięte do klasy pochodnej z pełnym dostępem do klasy pochodnej członków.

Zapraszam do edycji i dodawania konkretnych przykładów użycia, ewentualnie do innych postów SO .

 32
Author: 4 revsRoger Pate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:44

PImpl: Pointer-to-Implementation

Idiom pImpl jest bardzo przydatnym sposobem oddzielenia interfejsu klasy od jej implementacji.

Zazwyczaj definicja klasy musi zawierać zmienne członkowskie, jak również metody, które mogą ujawniać zbyt wiele informacji. Na przykład zmienna członkowska może być typu zdefiniowanego w nagłówku, którego nie chcemy wszędzie umieszczać.

Nagłówek windows.h jest tutaj najlepszym przykładem. Możemy chcieć zawinąć HANDLE lub inny typ Win32 wewnątrz klasy, ale nie możemy umieścić HANDLE w definicji klasy bez konieczności włączania windows.h wszędzie, gdzie klasa jest używana.

Rozwiązaniem jest utworzenie P rivateIMPL ementation lubPointer-to-IMPL ementation klasy, i niech publiczna implementacja przechowuje tylko wskaźnik do prywatnej i przekazuje wszystkie metody członkowskie.

Na przykład:

class private_foo; // a forward declaration a pointer may be used

// foo.h
class foo {
public:
  foo();
  ~foo();
  void bar();
private:
  private_foo* pImpl;
};

// foo.cpp
#include whichever header defines the types T and U

// define the private implementation class
class private_foo {
public:
  void bar() { /*...*/ }

private:
  T member1;
  U member2;
};

// fill in the public interface function definitions:
foo::foo() : pImpl(new private_foo()) {}
foo::~foo() { delete pImpl; }
void foo::bar() { pImpl->bar(); }

Wdrożenie foo jest teraz oddzielone od jego publicznego interfejs, tak że

  • może używać elementów składowych i typów z innych nagłówków, nie wymagając, aby te zależności były obecne, gdy klasa jest używana, oraz
  • implementacja może być modyfikowana bez wymuszania rekompilacji kodu używającego klasy.

Użytkownicy klasy po prostu dołączają nagłówek, który nie zawiera nic konkretnego na temat implementacji klasy. Wszystkie szczegóły implementacji zawarte są w foo.cpp.

 25
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 18:19:14

Lubię ustawiać kod/inicjalizację w 'kolumnach'... Okazuje się bardzo przydatny przy edycji z edytorem zdolnym do trybu "kolumnowego", a także wydaje mi się dużo łatwiejszy do odczytania...

int myVar        = 1;    // comment 1
int myLongerVar  = 200;  // comment 2

MyStruct arrayOfMyStruct[] = 
{   
    // Name,                 timeout,   valid
    {"A string",             1000,      true    },   // Comment 1
    {"Another string",       2000,      false   },   // Comment 2 
    {"Yet another string",   11111000,  false   },   // Comment 3
    {NULL,                   5,         true    },   // Comment 4
};

Natomiast pojawi się ten sam kod, który nie jest wcięty i sformatowany jak powyżej... (A little harder to read to my eyes)

int myVar = 1; // comment 1
int myLongerVar = 200; // comment 2

MyStruct arrayOfMyStruct[] = 
{   
    // Name, timeout, valid
    {"A string", 1000, true},// Comment 1
    {"Another string", 2000, false }, // Comment 2 
    {"Yet another string", 11111000,false}, // Comment 3
    {NULL, 5, true }, // Comment 4
};
 22
Author: Prembo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 22:09:02

Public Top-Private Down

Pozornie mała optymalizacja, ale odkąd przeszedłem na tę konwencję, mam o wiele więcej zabawy, aby uchwycić moje zajęcia, zwłaszcza po tym, jak nie oglądałem ich od 42 lat.

Konsekwentna widoczność członków, przechodzenie od punktów częstego zainteresowania do nudnych rzeczy, jest niezwykle pomocna, zwłaszcza gdy kod powinien być samodokumentujący.

(uwaga dla Qt-userów: sloty są przed sygnałami, ponieważ powinny be called like non-slot member functions, and abstrahując od ich slottyness be unforgivable from non-slots)

  • publiczne, chronione, prywatne
  • potem Fabryka, ctor, dtor, kopiowanie, Zamiana
  • wtedy interfejs klasy' Na koniec, w oddzielnej sekcji private:, pojawiają się dane (najlepiej tylko wskaźnik impl).

Ta zasada pomaga również ton, jeśli masz problemy z utrzymaniem deklaracji klasy w czystości.

class Widget : public Purple {
public:
    // Factory methods.
    Widget FromRadians (float);
    Widget FromDegrees (float);

    // Ctors, rule of three, swap
    Widget();
    Widget (Widget const&);
    Widget &operator = (Widget const &);
    void swap (Widget &) throw();

    // Member methods.
    float area() const;

    // in case of qt {{ 
public slots:
    void invalidateBlackHole();

signals:
    void areaChanged (float);
    // }}

protected:    
    // same as public, but for protected members


private:    
    // same as public, but for private members

private:
    // data
    float widgetness_;
    bool  isMale_;
};
 11
Author: Sebastian Mach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-21 11:58:25

W poleceniach if, gdy istnieją trudne warunki, można wyraźnie pokazać, na jakim poziomie każdy warunek jest używany za pomocą wcięcia.

if (  (  (var1A == var2A)
      || (var1B == var2B))
   && (  (var1C == var2C)
      || (var1D == var2D)))
{
   // do something
}
 9
Author: zerbp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 20:44:25

No favorites but I will fix code that has:

  1. tabs-powoduje niewspółosiowość w wielu Idach i narzędziach do przeglądania kodu, ponieważ nie zawsze zgadzają się na tab w spacjach mod 8.
  2. linie dłuższe niż 80 kolumn-spójrzmy prawdzie w oczy, krótsze linie są bardziej czytelne. Mój mózg może analizować większość konwencji kodowania, o ile linie są krótkie.
  3. linie z końcowymi białymi spacjami-git będzie narzekał na to jako białe spacje błędy , które pojawiają się jako czerwone plamy w diffs, co jest irytujące.

Tutaj jest jednolinijkowy, aby znaleźć pliki obrażające:

git grep -I -E '<tab>|.{81,}|  *$' | cut -f1 -d: | sort -u

Gdzie <tab> jest znakiem tabulacji (Wyrażenie regularne POSIX nie robi \t)

 7
Author: ididak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 22:16:17

Re: ididak

Naprawiam kod, który łamie długie instrukcje na zbyt wiele krótkich linii.

Spójrzmy prawdzie w oczy: to już nie lata 90. Jeśli Twoja firma nie może sobie pozwolić na panoramiczne LCD dla swoich koderów, musisz znaleźć lepszą pracę:)

 6
Author: Buddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 22:25:01

Polimorfizm czasu kompilacji

(znany również jako polimorfizm syntaktyczny i polimorfizm statyczny, w przeciwieństwie do polimorfizmu czasowego.)

Z FUNKCJAMI szablonowymi, można pisać kod, który opiera się na konstruktorach typów i wywołaniu sygnatur rodzin parametryzowanych typów, bez konieczności wprowadzania wspólnej klasy bazowej.

W książce elementy programowania, autorzy określają to traktowanie typów jako abstrakcyjne rodzaje . Z koncepcje można określić wymagania dotyczące takich parametrów typu, choć C++ nie nakazuje takich specyfikacji.

Dwa proste przykłady:

#include <stdexcept>

template <typename T>
T twice(T n) {
  return 2 * n;
}

InIt find(InIt f, InIt l,
          typename std::iterator_traits<InIt>::reference v)
{
  while (f != l && *f != v)
    ++f;
  return f;
}   

int main(int argc, char* argv[]) {
  if (6 != twice(3))
    throw std::logic_error("3 x 2 = 6");

  int const nums[] = { 1, 2, 3 };
  if (nums + 4 != find(nums, nums + 4, 42))
    throw std::logic_error("42 should not have been found.");

  return 0;
}

Można wywołać twice z dowolnym typem regularnym, który ma zdefiniowany Operator binarny *. Podobnie, można wywołać find() z dowolnymi typami, które są porównywalne i że model iterator wejściowy . Jeden zestaw kodu działa podobnie na różnych typach, bez współdzielonych klas bazowych w zasięgu wzroku.

Oczywiście, co jest naprawdę chodzi o to, że ten sam kod źródłowy jest Rozszerzony do różnych funkcji specyficznych dla typu w czasie tworzenia szablonu, każda z osobnym wygenerowanym kodem maszynowym. Przyjęcie tego samego zestawu typów bez szablonów wymagałoby albo 1) oddzielnych funkcji pisanych odręcznie z określonymi podpisami, albo 2) polimorfizmu uruchomieniowego poprzez funkcje wirtualne.

 6
Author: seh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 19:46:55

Szablon i hak

Jest to sposób, aby obsłużyć jak najwięcej w frameworku i daćdrzwi lubhak do personalizacji przez użytkowników frameworka. Znany również jako Hotspot i metoda szablonów .

class Class {
  void PrintInvoice();     // Called Template (boilerplate) which uses CalcRate()
  virtual void CalcRate() = 0;  // Called Hook
}

class SubClass : public Class {
  virtual void CalcRate();      // Customized method
}

Opisany przez Wolfganga Pree w swojej książce wzorce projektowe dla programowania obiektowego.

 5
Author: epatel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 19:40:24

Nie wiem, czy to się kwalifikuje do idiomu, ale sporo ciężkiego programowania szablonów zależy (często mocno) od SFINAE (substitution failure is not a error). Kilka odpowiedzi na poprzednie pytanie zawiera przykłady.

 4
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:12

If/while / for wyrażenie (wyrażenia) w nawiasie z separatorem spacji

if (expression)  // preferred - if keyword sticks out more

Vs.

if(expression)  // looks too much like a void function call

To chyba oznacza, że lubię, gdy moje wywołania funkcji nie mają separatora spacji

foo(parm1, parm2);
 4
Author: franji1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-04 01:24:57

Po pracy z kimś, kto był częściowo ślepy - I na jego prośbę-przerzuciłem się na korzystanie z wielu innych przestrzeni. Nie podobało mi się wtedy, ale teraz wolę. Poza moją głową, jedynym miejscem, gdzie nie ma białych spacji między identyfikatorami i słowami kluczowymi i tym podobne jest po Nazwa funkcji i przed poniższymi nawiasami.

void foo( int a, int b )
{
  int c = a + ( a * ( a * b ) );
  if ( c > 12 )
    c += 9;
  return foo( 2, c );
}
 3
Author: Jamie Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-11 22:58:04

Naprawdę lubię umieszczać małe stwierdzenie w tej samej linii co if

int myFunc(int x) {
   if(x >20) return -1;
   //do other stuff ....
}
 3
Author: mempko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-12 08:58:14

Nie wiem, czy to się liczy jako idiom, ale zazwyczaj używam komentarzy w stylu doxygen, nawet jeśli projekt nie używa jeszcze doxygen...

bool MyObjects::isUpToSomething() ///< Is my object up to something 

(na bok. Moje komentarze zazwyczaj nie są aż tak lamerskie.)

 2
Author: Roddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 18:50:22

Przydatne jest umieszczanie nazw funkcji w nowej linii, dzięki czemu możesz grepować jak

grep -R '^fun_name' .
Dla nich. Widziałem ten styl używany w wielu projektach GNU i lubię go:
static void
fun_name (int a, int b) {
    /* ... */
}
 2
Author: Johannes Schaub - litb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-11 11:07:32

Zapisuje każdą metodę lub argument funkcji w osobnej linii, tak aby można było ją łatwo skomentować.

int ReturnMaxValue(
    int* inputList,   /* the list of integer values from which to get the maximum */
    long size,        /* count of the number of integer values in inputList */
    char* extraArgs   /* additional arguments that a caller can provide.    */
)
 1
Author: Ather,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 17:54:38

Sugerowałbym PIMPL lub jak James Coplien pierwotnie nazywał to "korpus uchwytu".

Ten idiom pozwala całkowicie oddzielić interfejs od implementacji. Podczas pracy nad przepisaniem i ponownym wydaniem głównego komponentu middleware CORBA, ten idiom został użyty do całkowitego oddzielenia API od implementacji.

To praktycznie wyeliminowało wszelkie możliwości inżynierii odwrotnej.

Doskonałym źródłem dla idiomów C++ jest doskonała książka Jamesa Copliena " Advanced C++ Style programowania i idiomy". Gorąco polecam!

Edit: Jak zauważył poniżej Neil, ta książka jest dość nieaktualna, a wiele z jego zaleceń jest faktycznie włączonych do samego standardu C++. Jednak nadal uważam, że jest to źródło użytecznych informacji, esp. w formie pracy PLoP na temat idiomów C++ , w której wiele idiomów przekształcono w formę patterm.

 1
Author: Rob Wells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 19:10:06

Zawsze dodaję i edytuję:

  • zbędne newlines
  • Brak newline w EOF
 0
Author: korona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-11 10:53:24

Zwykle trzymam się KNF opisanego w stylu *BSD (9)

 0
Author: Terminus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-11 11:19:33

Dokumentuje zwracane wartości w linii funkcji, dzięki czemu są one bardzo łatwe do znalezienia.

int function(void) /* return 1 on success, 0 on failure */ 
{
    return 1;
};
 0
Author: EvilTeach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-22 23:20:00

Mam tendencję do stawiania innych na wszystkich moich "if".

if (condition)
{
    complicated code goes here
}
else
{
    /* This is a comment as to why the else path isn't significant */ 
}
Nawet jeśli to denerwuje moich współpracowników. Można powiedzieć na pierwszy rzut oka, że rozważałem sprawę else podczas kodowania.
 -1
Author: EvilTeach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 01:38:11