根据编译的条件(某个特定的宏)以控制代码的生成(.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
生成一个可让开发者自定义的特定的编译(而非运行时)错误的消息,以阻止程序编译通过。
用法:在C语言程序开发中,往往存在某些宏,或是系统文件或是外部文件指定,当出现不清楚该宏是否已定义的情况时,为保证程序的精确性可以使用#error来抛出一个error
注意:message不可加于双引号内
#include
#define ERROR
int main()
{
#ifdef ERROR
#error YOU HAVE A ERROR
#endif
printf("#error用法");//编译出错 提示 YOU HAVE A ERROR
return 0;
}
生成一个可让开发者自定义的特定的编译(而非运行时)警告的消息,不会阻止程序编译。
用法类似#error
注意:在vs2013中已被遗弃
#line number ''filename"
本质为永久修改__FILE__和__LINE__宏的内容,调试专用,通常用来调试定位。
注意:number代表设置的程序当前所在的行号、filename表示修改后的源文件名。
#include
#include
int main()
{
#line 10 "test.c"
printf("%s的第%d行\n", __FILE__, __LINE__);//输出 本句代码在test.c文件的第10行
system("pause"); //getchar(); 由于使用#line 致使代码区设置的断点不会命中 本句只为调试
return 0;
}
特殊的预编译指令,并非完全意义上的预编译指令,本质为预编译指示字,C标准留给编译器的一个特殊的接口,并非作用于代码,指示编译器完成一些特定的动作,不同编译器对它的理解是不同的,比如,可能VS下可以使用一些预编译指示字,但是在Linux平台下的GCC却不可以使用预编译指示字,与编译器相关,不具备移植性,但单编译器遇到它没有定义的预编译指示字的时候,它会选择忽略。
一般格式
#pragma Para
Para为参数
#pragma message("文本消息")
指示编译器在编译信息输出窗口中输出相应的信息,常用于控制程序源码的信息,比如,程序版本的信息控制。
#include
#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
#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
#define STRING(n) #n
int main()
{
printf("%s\n", STRING(hello word));//输出hello word
return 0;
}
连接符,将两个宏参数连接在一起。
#include
#include
#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;
}