C语言条件编译

条件编译

总览图

概念

根据编译的条件(某个特定的宏)以控制代码的生成(.i后缀的预处理文件中可见生成的代码),类似C语言的if语句的功能。

常用预编译指令

编译的预处理环节当中与编译器交互的指令、以#开头,分为三种:文件包含、宏定义、条件编译,如:

//条件包含
#include
//宏定义
#define
#undef
//条件编译
#ifndef...#endif
#ifndef...#else...#endif
#ifndef...#define...#endif
#ifdefine...#endif
#ifdefine...#else...#endif
#if...#else...#endif
#if...#elif...#else...#endif

特殊预编译指令

错误提示预编译指令

#error message

生成一个可让开发者自定义的特定的编译(而非运行时)错误的消息,以阻止程序编译通过。

用法:在C语言程序开发中,往往存在某些宏,或是系统文件或是外部文件指定,当出现不清楚该宏是否已定义的情况时,为保证程序的精确性可以使用#error来抛出一个error

注意:message不可加于双引号内

#include<stdio.h>
#define ERROR
int main()
{	
#ifdef ERROR
#error YOU HAVE A ERROR
#endif
	printf("#error用法");//编译出错 提示 YOU HAVE A ERROR
	return 0;
}

#warning message

生成一个可让开发者自定义的特定的编译(而非运行时)警告的消息,不会阻止程序编译。

用法类似#error

注意:在vs2013中已被遗弃

设置文件名及行号的预编译指令

#line number ''filename"

本质为永久修改__FILE__和__LINE__宏的内容,调试专用,通常用来调试定位。

注意:number代表设置的程序当前所在的行号、filename表示修改后的源文件名。

#include<stdio.h>
#include<stdlib.h>
int main()
{	
	#line 10 "test.c"
	printf("%s的第%d行\n", __FILE__, __LINE__);//输出 本句代码在test.c文件的第10行
	system("pause");	//getchar(); 由于使用#line 致使代码区设置的断点不会命中 本句只为调试
	return 0;
}

预编译指示字

#pragma

特殊的预编译指令,并非完全意义上的预编译指令,本质为预编译指示字,C标准留给编译器的一个特殊的接口,并非作用于代码,指示编译器完成一些特定的动作,不同编译器对它的理解是不同的,比如,可能VS下可以使用一些预编译指示字,但是在Linux平台下的GCC却不可以使用预编译指示字,与编译器相关,不具备移植性,但单编译器遇到它没有定义的预编译指示字的时候,它会选择忽略。

一般格式

#pragma Para

Para为参数

#pragma message("文本消息")

指示编译器在编译信息输出窗口中输出相应的信息,常用于控制程序源码的信息,比如,程序版本的信息控制。

#include<stdio.h>
#define VER 1
#if(VER==1)
#pragma message("版本1.0")
#elif(VER==2)
#pragma message("版本2.0")
#endif
int main()
{	
	return 0;//编译输出窗口会输出版本1.0
}

#pragma push()

字节对齐

#pragma once

指示编译器只对该文件编译一次

条件编译的用法

常用用法:处理文件重复包含;区分不同版本代码

版本区分

通过特定的宏来区别版本,宏的定义方式其一可写在代码里面;其二,可写在编译器的预处理定义上。

其二的方式步骤:右键工程->选择选择属性->VC/C++->预处理器->预处理器定义->点击编辑->输入宏名->确定。

#include<stdio.h>
#define GOOGLE 1001
int main()
{	
	int num = 0;
#if GOOGLE
	num = 100;
#elif JAPAN
	num = 1000;
#else
	num = 100000;
#endif
	printf("%d\r\n", num);//输出1000
	return 0;
}

防止文件重复包含

根据判断宏是定义的条件来控制代码的读取,以此达到防止文件内容被重复读取。

//Test.h
#ifndef _TEST_H_
#define _TEST_H_

#include "test2.h"
#include "test3.h"
#include "test4.h"

#endif

符号#

#

将宏参数转化为字符串。

#include<stdio.h>
#define STRING(n) #n
int main()
{	
	printf("%s\n", STRING(hello word));//输出hello word
	return 0;
}

##

连接符,将两个宏参数连接在一起。

#include<stdio.h>
#include<string.h>
#define STRCPY(a,b) strcpy(str_##a,b)
int main()
{	
	char str_hello[100];
	char str_world[100];
	STRCPY(hello, "hello");//等同于strcpy(str_hello,"hello")
	STRCPY(world, "world");//类似上
	printf("%s\t", str_hello);
	printf("%s\n", str_world);//输出hello world
	system("pause");
	return 0;
}

 

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值