C Language
Komentarze
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 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
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;