C++中几个罕见却有用的预编译和宏定义

1、#error

语法格式:#error token-sequence

主要作用:在编译的时候输出编译错误信息token-sequence,方便程序员检查程序中出现的错误。

实      例:

#include "stdio.h"
int main(int argc, char* argv[])
{
	#define CONST_NAME1 "CONST_NAME1"
	printf("%s\n",CONST_NAME1);
	#undef CONST_NAME1

	#ifndef CONST_NAME1
	#error No defined Constant Symbol CONST_NAME1
	#endif
	{
		#define CONST_NAME2 "CONST_NAME2"
		printf("%s\n",CONST_NAME2);
	}

	printf("%s\n",CONST_NAME2);
	return 0;
}

 

在编译的时候输出如下编译信息:

fatal error C1189: #error : No defined Constant Symbol CONST_NAME1

若将程序改成如下:

#include "stdio.h"
int main(int argc, char* argv[])
{
	#define CONST_NAME1 "CONST_NAME1"
	printf("%s\n",CONST_NAME1);
	#undef CONST_NAME1

	#define CONST_NAME1 "CONST_NAME1"

	#ifndef CONST_NAME1
	#error No defined Constant Symbol CONST_NAME1
	#endif
	{
		#define CONST_NAME2 "CONST_NAME2"
		printf("%s\n",CONST_NAME2);
	}

	printf("%s\n",CONST_NAME2);
	return 0;
}


则编译无误,输出结果为:

 

2、#pragma

语法格式:#pragma token-sequence

主要作用:触发所定义的动作。如果token-sequence存在,则触发相应的动作,否则忽略。

说      明:此指令一般为编译系统所使用。如在Visual C++.Net 中利用# pragma once 防止同一代码被包含多次。

3、#line

说明:此命令主要是为强制编译器按指定的行号,开始对源程序的代码重新编号,在调试的时候,可以按此规定输出错误代码的准确位置。

形式1

语法格式:# line constant “filename”

主要作用:使得其后的源代码从指定的行号constant开始重新编号,并将当前文件的名命名为filename。

形式2

语法格式:# line constant

主要作用:编译时,准确输出出错代码所在的位置(行号),而在源程序中并不出现行号,从而方便程序员准确定位。

实      例:

#include "stdio.h"

void Test();
#line 10 "Hello.c"

int main(int argc, char* argv[])
{
	#define CONST_NAME1 "CONST_NAME1"
	printf("%s\n",CONST_NAME1);
	#undef CONST_NAME1
	printf("%s\n",CONST_NAME1);
	{
		#define CONST_NAME2 "CONST_NAME2"
		printf("%s\n",CONST_NAME2);
	}
	printf("%s\n",CONST_NAME2);
	return 0;
}

void Test()
{
	printf("%s\n",CONST_NAME2);
}

提示如下的编译信息:

Hello.c(15) : error C2065: 'CONST_NAME1' : undeclared identifier

表示当前文件的名称被认为是Hello.c, #line 10 "Hello.c"所在的行被认为是第10行,因此提示第15行出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值