C和C++间的注释转换(初版)

本文介绍了如何将C语言的注释转换为C++兼容的格式,详细讲解了两种语言间注释的差异和转换方法,帮助开发者在混合使用C和C++代码时解决注释兼容问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是初学时写的一个小的项目,当时代码弄丢了,今天找回来了,发出来
代码是老早就写了最开始,没有经过更进一步的改进,仍然存在很多问题,但是对于一般的来说都是可以进行转换的

首先是为什么要进行注释转换,大家都知道在C和C++中注释方式是不相同的,有时候需要将一些代码进行排版统一。
而有时候一个项目代码的量实在太大,手工改有点不现实,这种情况下注释转换的作用就体现了出来。

我们以下部分注释为例进行测试
//每个区由若干个内存块组成
//每个区由若干个内存块组成,//每个块是4096个字节
//int i = 0;*/
//*//*int i = 0;
// /**/int i = 0;
/* int i = 0;              
 *//*
 */
/* int i = 0;
//*/int j = 0;
/*
//每个区由若干个内存块组成,每个块是4096个字节
//每个块的第0个整数指向下个区
//所以是单链表结构
//所以每个区只有4092个字节存放真正的数据               
*/
/* int i = 0;*//*int j = 0;              
 */
/*
 *//*
 */int i =0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////     5

"abcdefghijklmn~~~~!!!!!!!!"
/////////////xyz
/////////////6/2=3
char *str = "hello //comment convert.";
//char *str = "hello //comment convert.";
/*char *str = "hello //comment convert.";*/
/*char *str = "hello //comment convert.;*/
char *str1 = "hello /* comment */ convert.";
char *str = "abc\"syz";
//char *str = "abc\"syz";
/*abc**/
//abc"xy//z"
//abc"xy*/z"

代码主函数部分

#include<iostream>
using namespace std;

extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);

int main()
{
	FILE *fpIn = fopen("input.c", "r");
	if(fpIn == NULL)
	{
		cout<<"Open input.c file Fail."<<endl;
		return -1;
	}
	FILE *fpOut = fopen("output.c", "w");
	if(fpOut == NULL)
	{
		cout<<"Open output.c file Fail."<<endl;
		return -1;
	}

	ConvertComment(fpIn, fpOut); //

	fclose(fpIn);
	fclose(fpOut);
	return 0;
}
可以看到代码的功能是将input.c里面的如上注释

转换为C的注释


实现部分

#include<iostream>
using namespace std;

extern "C" int ConvertComment(FILE *inputfile, FILE *outputfile);

typedef unsigned long ulong;

//定义状态
typedef enum
{
	NO_COMMENT_STATE, //无注释状态
	C_COMMENT_STATE,  //C注释状态
	CPP_COMMENT_STATE,//C++注释状态
	//CSTR_COMMENT_STATE,
	//CPPSTR_COMMENT_STATE,
	END_STATE
}ENUM_STATE;

//定义状态机
typedef struct 
{
	FILE *inputfile;
	FILE *outputfile;
	ENUM_STATE ulstate;
}state_machine;

//////////////////////////////////////////////////////
state_machine g_state;
void EventPro(char ch);
void EventProAtNo(char ch);
void EventProAtC(char ch);
void EventProAtCpp(char ch);
//void EventProAtCStr(char ch); //碰到字符串时的状况,有些问题先屏蔽掉
//void EventProAtCPPStr(char ch);//同上
//////////////////////////////////////////////////////

int ConvertComment(FILE *inputfile, FILE *outputfile)
{
	if(inputfile==NULL || outputfile==NULL)
	{
		cout<<"Input Argument is Invalid."<<endl;
		return -1;
	}

	/////////////////////////////////////////////////////////
	g_state.inputfile = inputfile;
	g_state.outputfile = outputfile;
	g_state.ulstate = NO_COMMENT_STATE;

	char ch;
	while(g_state.ulstate != END_STATE)
	{
		ch = fgetc(g_state.inputfile);
		EventPro(ch);
	}

	return 0;
}

void EventPro(char ch)
{
	switch(g_state.ulstate)
	{
	case NO_COMMENT_STATE:
		EventProAtNo(ch);
		break;
	case C_COMMENT_STATE:
		EventProAtC(ch);
		break;
	case CPP_COMMENT_STATE:
		EventProAtCpp(ch);
		break;
	/*case CSTR_COMMENT_STATE:
		EventProAtCStr(ch);
		break;
	case CPPSTR_COMMENT_STATE:
		EventProAtCPPStr(ch);
		break;*/
	default:
		break;
	}
}

void EventProAtNo(char ch)//无注释状态下进行操作
{
	char nextch;
	switch(ch)
	{
	case EOF:
		g_state.ulstate = END_STATE;
	case '/':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/') //C++
		{
			fputc('/', g_state.outputfile);
			fputc('*', g_state.outputfile);
			g_state.ulstate = CPP_COMMENT_STATE;
		}
		else if(nextch == '*') //C
		{
			fputc(ch, g_state.outputfile);
			fputc(nextch, g_state.outputfile);
			g_state.ulstate = C_COMMENT_STATE;
		}
		else
		{
			fputc(ch, g_state.outputfile);
			fputc(nextch, g_state.outputfile);
		}
		break;
	/*case '"':
		fputc(ch, g_state.outputfile);
		g_state.ulstate = CPPSTR_COMMENT_STATE;
		break;*/
	default:
		fputc(ch, g_state.outputfile);
		break;
	}
}

/*void EventProAtCStr(char ch)
{
	switch(ch)
	{
	case '"':
		fputc(ch, g_state.outputfile);
		g_state.ulstate = NO_COMMENT_STATE;
		break;
	case EOF:
		g_state.ulstate = END_STATE;
		break;
	default:
		fputc(ch,g_state.outputfile);
		break;
	}
}*/

/*void EventProAtCPPStr(char ch)
{
	switch(ch)
	{
	case '"':
		fputc(ch, g_state.outputfile);
		g_state.ulstate = NO_COMMENT_STATE;
		break;
	case EOF:
		g_state.ulstate = END_STATE;
		break;
	case '\n':
		fputc('*',g_state.outputfile);
		fputc('/',g_state.outputfile);
		fputc(ch, g_state.outputfile);
		g_state.ulstate = NO_COMMENT_STATE;
	default:
		fputc(ch,g_state.outputfile);
		break;
	}
}*/

void EventProAtC(char ch)
{
	char nextch;
	char thrch;
	switch(ch)
	{
	case EOF:
		fputc('*', g_state.outputfile);
		fputc('/', g_state.outputfile);
		g_state.ulstate = END_STATE;
		break;
	case '/':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/' || nextch == '*')
		{
			fputc(' ', g_state.outputfile);
			fputc(' ', g_state.outputfile);
		}
		else
		{
			fputc(ch, g_state.outputfile);
		}
		break;
	case '*':
		nextch = fgetc(g_state.inputfile);
		thrch = fgetc(g_state.inputfile);
		if(nextch == '*')
		{
			if(thrch == '/')
			{
				fputc(' ', g_state.outputfile);
				fseek(g_state.inputfile,-2,1);
			}
			else
			{
				fputc(ch, g_state.outputfile);
				fputc(nextch, g_state.outputfile);
				fseek(g_state.inputfile,-1,1);
			}
		}
		else if(nextch == '/')
		{
			fputc('*', g_state.outputfile);
			fputc('/', g_state.outputfile);
			fseek(g_state.inputfile,-1,1);
			g_state.ulstate = NO_COMMENT_STATE;
		}
		else
		{
			fputc(ch, g_state.outputfile);
			fputc(nextch, g_state.outputfile);
			fputc(thrch, g_state.outputfile);
		}
		break;	
	case '"':
		switch(ch)
		{
		case '"':
			g_state.ulstate = NO_COMMENT_STATE;
			break;
		case EOF:
			g_state.ulstate = END_STATE;
			break;
		default:
			fputc(ch,g_state.outputfile);
			break;
		}
	default:
		fputc(ch, g_state.outputfile);
		break;
	}
}
void EventProAtCpp(char ch)
{
	char nextch;
	char thrch;
	switch(ch)
	{
	case EOF:
		fputc('*', g_state.outputfile);
		fputc('/', g_state.outputfile);
		g_state.ulstate = END_STATE;
		break;
	case '\n':
		fputc('*',g_state.outputfile);
		fputc('/',g_state.outputfile);
		fputc(ch, g_state.outputfile);
		g_state.ulstate = NO_COMMENT_STATE;
		break;
	case '/':
		nextch = fgetc(g_state.inputfile);
		thrch = fgetc(g_state.inputfile);
		if(nextch == '/')
		{
			if(thrch == '/')
			{
				fputc(' ', g_state.outputfile);
				fseek(g_state.inputfile,-2,1);
			}
			else
			{
				fputc(' ', g_state.outputfile);
				fputc(' ', g_state.outputfile);
				fseek(g_state.inputfile,-1,1);
			}
		}
		else if(nextch == '*')
		{
			fputc(' ', g_state.outputfile);
			fputc(' ', g_state.outputfile);
			fseek(g_state.inputfile,-1,1);
		}
		else
		{
			fputc(ch, g_state.outputfile);
			fputc(nextch, g_state.outputfile);
			fputc(thrch, g_state.outputfile);
		}
		break;
	case '*':
		nextch = fgetc(g_state.inputfile);
		if(nextch == '/')
		{
			fputc(' ', g_state.outputfile);
			fputc(' ', g_state.outputfile);
		}
		else
		{
			fputc(ch, g_state.outputfile);
			fputc(nextch,g_state.outputfile);
		}
		break;
	case '"':
		switch(ch)
		{
		case '"':
			g_state.ulstate = NO_COMMENT_STATE;
			break;
		case EOF:
			g_state.ulstate = END_STATE;
			break;
		case '\n':
			fputc('*',g_state.outputfile);
			fputc('/',g_state.outputfile);
			fputc(ch, g_state.outputfile);
			g_state.ulstate = NO_COMMENT_STATE;
		default:
			fputc(ch,g_state.outputfile);
			break;
		}
	default:
		fputc(ch, g_state.outputfile);
		break;
	}
}

/*
int ConvertComment(FILE *inputfile, FILE *outputfile)
{
	if(inputfile==NULL || outputfile==NULL)
	{
		cout<<"Input Argument is Invalid."<<endl;
		return -1;
	}

	/////////////////////////////////////////////////////////
	char ch, nextch;
	ch = fgetc(inputfile);
	while(ch != EOF)
	{
	if(ch == '/')
		{
			nextch = fgetc(inputfile);
			if(nextch == '/') //C++ Comment
			{
				fputc('/', outputfile);
				fputc('*', outputfile);
			}
			else if(nextch == '*') // C Comment
			{}
			else
			{}
		}
		else
		{
			fputc(ch, outputfile);  
		}

		ch = fgetc(inputfile);
	}
	fputc('*', outputfile);
	fputc('/', outputfile);
	return 0;
}
*/
由于代码是最开始写的一版 没有进行改进 所以关于碰到字符串的部分

我屏蔽掉了,那部分是有一些问题的。后来我对代码也进行了一些改进下次发出来。

针对如上的测试文档运行结果


/*每个区由若干个内存块组成*/
/*每个区由若干个内存块组成,  每个块是4096个字节*/
/*int i = 0;  */
/*    int i = 0;*/
/*     int i = 0; */
/* int i = 0;              
 *//*
 */
/* int i = 0;
  */int j = 0;
/*
  每个区由若干个内存块组成,每个块是4096个字节
  每个块的第0个整数指向下个区
  所以是单链表结构
  所以每个区只有4092个字节存放真正的数据               
*/
/* int i = 0;*//*int j = 0;              
 */
/*
 *//*
 */int i =0;
/*                                                                                                                                                                                                                               5*/

"abcdefghijklmn~~~~!!!!!!!!"
/*           xyz*/
/*           6/2=3*/
char *str = "hello /*comment convert.";
/*char *str = "hello /*comment convert.";
/*char *str = "hello /*comment convert.";*/
/*char *str = "hello /*comment convert.;  */
char *str1 = "hello /* comment */ convert.";
char *str = "abc\"syz";
/*char *str = "abc\"syz";
/*abc */
/*abc"xy/*z"

/*abc"xy*/z"

可以看到在后面碰到有字符串的部分,是没有办法进行注释转换的。这个问题很好解决,下次发出来改进后的代码


ps:再次吐槽csdn的编辑器,就不能改进一下?QAQ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值