注释

< c

注释的作用是一套代码内文档。插入注释到程序中时,编译器直接忽略它们;它们只是有意地被人类用作读取源码的笔记。

语法

/* 注释 */ (1)
// 注释\n (2) (C99 起)
1) 通称为“ C 风格”或“多行”注释。
2) 通称为“ C++ 风格”或“单行”注释。

翻译阶段 3,通过把每段注释替换为单个空白字符,将所有注释从程序中移除。

C 风格

C 风格注释通常用于注释大块文本或小片代码;然而,能用它们注释单行。可以简单地以 /**/ 环绕文本,将文本作为 C 风格注释插入。 C 风格注释告诉编译器忽略 /**/ 间的所有内容。尽管不是 C 标准的一部分, /***/ 常用于指示文档块;这是合法的,因为星号被简单地当做注释的一部分。

除了在字符常量字符串字面量或注释中,字符 /* 引入一段注释。检验这种注释的内容仅是为了鉴别多字节字符,以及寻找终止注释的 */ 。 C 风格注释不能嵌套。

C++ 风格

C++ 风格注释通常用于注释单行文本或代码;然而,能将它们放在一起组成多行注释。可以简单地将 // 置于文本前,文本后跟随换行符,以将文本作为 C++ 风格注释插入。 C++ 风格注释告诉编译器忽略 // 和换行符间的所有内容。

除了在字符常量字符串字面量或注释中,字符 // 引入一段注释,它包含所有多字节字符,直至但不包含下个换行符。检验这种注释的内容仅是为了鉴别多字节字符,以及寻找终止注释的换行符。 C++ 风格注释能嵌套:

//  y = f(x);   // 调用算法

C 风格注释可出现在 C++ 风格注释内:

//  y = f(x);   /* 调用算法 */

C++ 风格注释可出现在 C 风格注释内;这是排除一小块源代码的机制:

/*
    y = f(x);   // 调用算法
    z = g(x);
*/


(C99 起)

注意

因为注释在预处理器阶段前被移除,宏不能用于组成注释,而不终止的 C 风格注释不会从被 #include 的文件中漏出。

/* 试图用宏组成注释。 */
/* 但空格替换字符 "//" 。 */
#ifndef DEBUG
    #define PRINTF //
#else
    #define PRINTF printf
#endif
...  
PRINTF("Error in file %s at line %i\n", __FILE__, __LINE__);

除了注释掉,用于排除源码的其他机制是:

#if 0
    puts("this will not be compiled");
    /* 与 C 风格注释不冲突 */
    // 与 C++ 风格注释不冲突
#endif

if(0) {
    puts("this will be compiled but not be executed");
    /* 与 C 风格注释不冲突 */
    // 与 C++ 风格注释不冲突
}

C99 中引入 // 注释,在一些罕有场合是破坏性更改:

a = b //*除数:*/ c
+ d; /* C89 编译为 a = b / c + d;
        C99 编译为 a = b + d; */

示例

/*
C 风格注释
能含有多行。
*/
 
/* 或仅一行。 */
 
// C++ 风格注释能注释一行。
 
// 或者,能将
// 它们串在一起。
#include <stdio.h>
 
int main(void)
{
  // 将不运行下方代码
  // puts("Hello");
 
  // 将运行下方代码
  puts("Hello");
  return 0;
}


引用

  • C11 standard (ISO/IEC 9899:2011):
  • 6.4.9 Comments (p: 75)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.4.9 Comments (p: 66)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.1.9 Comments

参阅