一直以来不知道条件编译有什么卵用,也不会用条件编译,最近看《算法竞赛入门经典》时,又接触到了这个概念,便稍微学了一点,于是积累下来,记作一篇经验。
首先是条件编译的概念:
顾名思义,在某些条件下进行编译,某些条件下不进行编译。
接着,给出条件编译的三种用法:
1.#if和#endif
一般形式为:
#if 常量表达式
程序段
#endif
用法:当常量表达式的值为真时,编译程序段,否则不编译。
程序段不需要加{},因为#if #endif已经起到了{}的作用,且#if与#endif必须配对使用
2.带#elif的条件编译
一般形式为:
#if 常量表达式1
程序段1
#elif 常量表达式2
程序段2
#elif 常量表达式3
程序段3
#endif
用法:elif即else if ,类比if、else if、else即可。
3.#ifdef的使用
一般形式为:
#ifdef 宏名
程序段1
#else
程序段2
#endif
如果宏名被定义,则编译程序段1,否则编译程序段2
以上为条件编译的三种用法,除此以外还有#ifndef和#ifdef相似,只不过是宏名没有被定义时编译程序段1
下面演示第一种用法(其中有输入输出重定向的内容,不明白的参照我的相关博客):
#include <cstdio>
#define H 1
int main()
{
int a;
#if H //若H真,编译两行freopen
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
scanf("%d", &a);
printf("%d", 5 * a);
#if H //若H真,编译两行fclose
fclose(stdin);
fclose(stdout);
#endif
return 0;
}`
如代码所示,H为1,因此输入输出将对文件进行,执行代码,可以看到成功在文件中输出了相应结果,说明相关代码编译了。
在算法竞赛中,如果题目不允许通过文件I/O,那么我们把H的宏定义改为0即可,与输入输出重定向有关的代码便不会执行了。
以上是我初步学习条件编译的内容,作为个人学习总结,欢迎指教!