在C语言中标准的注释格式为"/*内容*/",在C++中标准的注释格式为“//”,今天来介绍将c注释转化为C++的注释的方法。
首先先给一堆用C语言注释的一对代码,进行分析(将此代码保存在input.c文件夹里)
<span style="font-size:18px;">// 1.一般情况
/* int i = 0; */
// 2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
// 3.匹配问题
/*int i = 0;/*xxxxx*/
// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/</span>
1、一般情况这种应该转换为
//int i=0;
2、由于这一行中后面部分没有注释所以涉及到这种的都必须在后面进行换行
//int i=0;
int j=0;
//int i=0;
int j=0;
3、由于每一个/*只匹配一个*/,所以结果应该为
//int i = 0;/*xxxxx
4、多行注释情况下应该每行都加注释,并且最后加换行将后面内容放开
//int i=0;
//int j = 0;
//int k = 0;
int k = 0;
5、这种情况下/*只会匹配最近的*/
//
//
6、这个只要了解/*至于*/匹配就行了
//*
7、遇到c++注释直接输出该行即可,//后面内容已经备注
// /*xxxxxxxxxxxx*/
下面进行代码实现
头文件
<span style="font-size:18px;">//注释转换
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __comment_convert__
#define __comment_convert__
#include<stdio.h>
#include<stdlib.h>
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
enum STATE
{
NULL_STATE,
C_STATE,
CPP_STATE,
END_STATE
};
void commentconvert(FILE *pfRead,FILE *pfWrite);
void Do_NULL_State(FILE *pfRead,FILE *pfWrite);
void Do_C_State(FILE *pfRead,FILE *pfWrite);
void Do_Cpp_State(FILE *pfRead,FILE *pfWrite);
#endif// __comment_convert__</span>
函数部分
<span style="font-size:18px;">#include "commentconvert.h"
enum STATE state;
void commentconvert(FILE *pfRead,FILE *pfWrite)
{
state=NULL_STATE;
while(state!=END_STATE)
{
switch(state)//switch语句选择调用
{
case NULL_STATE:
Do_NULL_State(pfRead,pfWrite);
break;
case C_STATE:
Do_C_State(pfRead,pfWrite);
break;
case CPP_STATE:
Do_Cpp_State(pfRead,pfWrite);
break;
case EOF:
break;
default:
break;
}
}
}
void Do_NULL_State(FILE *pfRead,FILE *pfWrite)
{
char first=0;
char second=0;
first=fgetc(pfRead);
switch(first)
{
case'/':
second=fgetc(pfRead);
if(second=='*')//为c语言注释
{
fputc(first,pfWrite);
fputc('/',pfWrite);
state=C_STATE;//进入处理C语言注释函数
}
else if(second=='/')//为C++注释
{
fputc(first,pfWrite);
fputc('/',pfWrite);
state=CPP_STATE;//进入处理c++注释函数
}
else
{
fputc(first,pfWrite);
fputc(second,pfWrite);
}
break;
case EOF:
fputc(first,pfWrite);
state=END_STATE;
break;
default :
fputc(first,pfWrite);
break;
}
}
void Do_C_State(FILE *pfRead,FILE *pfWrite)
{
char first=0;
char second=0;
char third=0;
first=fgetc(pfRead);
switch(first)
{
second=fgetc(pfRead);
case'*':
second = fgetc(pfRead);
if (second == '/')
{
state = NULL_STATE;
first = fgetc(pfRead);
if (first != '\n')
{
fputc('\n', pfWrite);
ungetc(first, pfRead);
}
else
{
fputc('\n', pfWrite);
}
}
else if (second == '*')
{
fputc(first, pfWrite);
ungetc(second,pfRead);
}
else
{
fputc(first, pfWrite);
fputc(second, pfWrite);
}
break;
case'\n':
fputc(first,pfWrite);
fputc('/',pfWrite);
fputc('/',pfWrite);
break;
case EOF:
fputc(first, pfWrite);
state=END_STATE;
break;
default :
fputc(first,pfWrite);
break;
}
}
void Do_Cpp_State(FILE *pfRead, FILE *pfWrite)
{
int first = 0;
int second = 0;
first = fgetc(pfRead);
switch (first)
{
case'/':
second = fgetc(pfRead);
if (second == '*')
{
fputc(first, pfWrite);
fputc(second, pfWrite);
}
else if (second == '/')
{
fputc(first, pfWrite);
fputc(second, pfWrite);
state = NULL_STATE;
}
else
{
fputc(first, pfWrite);
fputc(second, pfWrite);
}
break;
case'\n':
fputc(first, pfWrite);
state = NULL_STATE;
break;
case'*':
second = fgetc(pfRead);
if (second == '/')
{
fputc(first, pfWrite);
fputc(second, pfWrite);
}
else if (second == '*')
{
fputc(first, pfWrite);
ungetc(second, pfRead);
}
break;
case EOF:
state = END_STATE;
break;
default:
fputc(first, pfWrite);
break;
}
} </span>
函数功能比较简单,前面也细细的分析过内容,就不详细注释了
下面是测试函数
<span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1
#include"commentconvert.h"
int main()
{
FILE *pfRead = NULL;
FILE *pfWrite = NULL;
printf("转换开始\n");
pfRead = fopen(INPUTFILENAME, "r");//读取input.c中的代码,将代码转化后保存在output.c中
if (NULL == pfRead)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pfWrite = fopen(OUTPUTFILENAME, "w");
if (NULL == pfWrite)
{
fclose(pfRead);
perror("open file for write");
exit(EXIT_FAILURE);
}
commentconvert(pfRead, pfWrite);
printf("转换结束\n");
printf("按任意键继续...");
fclose(pfRead);
fclose(pfWrite);
getchar();
return 0;
}</span>
读取input.c中的代码,将代码转化后保存在output.c中
经过测试input.c后output.c结果为
<span style="font-size:18px;">// 1.一般情况
// int i = 0;
// 2.换行问题
// int i = 0;
int j = 0;
// int i = 0;
int j = 0;
// 3.匹配问题
//int i = 0;/*xxxxx
// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
//
int k = 0;
// 5.连续注释问题
//
//
// 6.连续的**/问题
//*
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
</span>
和上面分析完全一样,完成