Szukaj…


Wprowadzenie

Komentarze służą do wskazania czegoś osobie czytającej kod. Komentarze są traktowane przez kompilator jak puste miejsce i nie zmieniają niczego w rzeczywistym znaczeniu kodu. Istnieją dwie składnie używane do komentowania w C, oryginalny /* */ i nieco nowszy // . Niektóre systemy dokumentacji używają specjalnie sformatowanych komentarzy, aby pomóc w tworzeniu dokumentacji dla kodu.

Składnia

  • /*...*/
  • //... (tylko C99 i nowsze)

/ * * / rozdzielane komentarze

Komentarz zaczyna się od ukośnika, po którym następuje natychmiast gwiazdka ( /* ), a kończy się, gdy tylko napotka gwiazdkę, po której następuje ukośnik ( */ ). Wszystko pomiędzy tymi kombinacjami znaków jest komentarzem i jest traktowane przez kompilator jako puste (zasadniczo ignorowane).

/* this is a comment */

Powyższy komentarz jest komentarzem jednowierszowym. Komentarze tego typu /* mogą obejmować wiele wierszy, na przykład:

/* this is a
multi-line
comment */

Chociaż nie jest to absolutnie konieczne, powszechną konwencją stylów z komentarzami wieloliniowymi jest umieszczanie wiodących spacji i gwiazdek w wierszach po pierwszej, a /* i */ w nowych wierszach, tak aby wszystkie były w jednej linii:

/* 
 * this is a
 * multi-line
 * comment
 */

Dodatkowe gwiazdki nie mają żadnego funkcjonalnego wpływu na komentarz, ponieważ żadna z nich nie ma powiązanego ukośnika do przodu.

Tego typu /* komentarzy można użyć w osobnym wierszu, na końcu wiersza kodu, a nawet w wierszu kodu:

/* this comment is on its own line */
if (x && y) { /*this comment is at the end of a line */
    if ((complexCondition1) /* this comment is within a line of code */
            && (complexCondition2)) {
        /* this comment is within an if, on its own line */
    }
}

Komentarze nie mogą być zagnieżdżone. Wynika to z tego, że każdy kolejny /* zostanie zignorowany (jako część komentarza), a pierwszy */ osiągnięty zostanie potraktowany jako zakończenie komentarza. Komentarz w poniższym przykładzie nie będzie działać :

/* outer comment, means this is ignored => /* attempted inner comment */ <= ends the comment, not this one => */

Aby skomentować bloki kodu zawierające komentarze tego typu, które w innym przypadku byłyby zagnieżdżone, zobacz Komentowanie za pomocą przykładu preprocesora poniżej

// rozdzielone komentarze

C99

C99 wprowadził użycie komentarzy jednowierszowych w stylu C ++. Ten typ komentarza zaczyna się od dwóch ukośników i biegnie do końca linii:

// this is a comment

Ten typ komentarza nie pozwala na komentarze wieloliniowe, chociaż możliwe jest utworzenie bloku komentarza poprzez dodanie kilku komentarzy jednowierszowych jeden po drugim:

// each of these lines are a single-line comment
// note how each must start with
// the double forward-slash

Ten typ komentarza może być użyty we własnej linii lub na końcu linii kodu. Jednakże, ponieważ prowadzony do końca linii, nie mogą one być wykorzystane w linii kodu

// this comment is on its own line
if (x && y) { // this comment is at the end of a line
    // this comment is within an if, on its own line
}

Komentowanie za pomocą preprocesora

Duże fragmenty kodu można również „komentować” za pomocą dyrektyw preprocesora #if 0 i #endif . Jest to przydatne, gdy kod zawiera wieloliniowe komentarze, które w innym przypadku nie zagnieżdżałyby się.

#if 0 /* Starts the "comment", anything from here on is removed by preprocessor */ 

/* A large amount of code with multi-line comments */  
int foo()
{
    /* lots of code */
    ...

    /* ... some comment describing the if statement ... */
    if (someTest) {
        /* some more comments */
        return 1;
    }

    return 0;
}

#endif /* 0 */

/* code from here on is "uncommented" (included in compiled executable) */
... 

Możliwa pułapka z powodu kaligrafii

C99

Podczas pisania komentarzy z ogranicznikami // możliwe jest popełnienie błędu typograficznego, który wpływa na ich oczekiwane działanie. Jeśli jeden typ:

int x = 20;  // Why did I do this??/

/ Na końcu była literówka, ale teraz będzie się interpretować w \ . Wynika to z faktu, że ??/ tworzy trygrafię .

??/ trigraph jest w rzeczywistości notacją odręczną dla \ , która jest symbolem kontynuacji linii. Oznacza to, że kompilator uważa, że następny wiersz jest kontynuacją bieżącego wiersza, to znaczy kontynuacją komentarza, co może być niezgodne z przeznaczeniem.

int foo = 20; // Start at 20 ??/
int bar = 0;

// The following will cause a compilation error (undeclared variable 'bar')
// because 'int bar = 0;' is part of the comment on the preceding line
bar += foo;


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow