| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> C++知识库 -> 15.程序环境和预处理 -> 正文阅读 |
|
|
[C++知识库]15.程序环境和预处理 |
|
目录 程序的翻译环境和执行环境
|
| 属性 | #define定义宏 | 函数 |
|---|---|---|
| 代码长度 | 每次使用时,宏代码都会被插入到程序中。处理非常小的宏之外,程序的长度会大幅增长 | 函数代码只出现于一个地方;每次使用这个函数时,都会调用那个地方的同一份代码 |
| 执行速度 | 更快 | 存在函数的调用和返回的额外开销 |
| 操作符的优先级 | 宏参数的求值是在所有周围表达式的上下文环境里,除法加上括号,否则邻近操作符的优先级可能会产生不可预料的后果,所以建议宏在书写的时候多些括号 | 函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。 |
| 带有副作用的参数 | 参数可能被替换到宏体的多个位置,所以带有副作用的参数求值可能会产生不可预料的后果。 | 函数参数只在传参的时候求值一次,结果更容易控制 |
| 参数的类型 | 宏的参数与类型无关,只要对参数的操作是合法的,它就可以适用于任何参数类型 | 函数的参数与类型有关,如果参数的类型不同,就需要不同的函数,即使他们执行的任务是相同的 |
| 调试 | 宏是不方便调试的 | 函数是可以逐语句调试的 |
| 递归 | 宏是不能递归的 | 函数是可以递归的 |
命名约定:
宏全部大写
函数名不要全部大写?
#undef: 用于移除一个宏定义
#include <stdio.h>
#define MAX(x, y) ((x) > (y) ? (x) : (y))
int main()
{
int m = MAX(2, 3);
printf("%d\n", m);
return 0;
}

#include <stdio.h>
#define MAX(x, y) ((x) > (y) ? (x) : (y))
int main()
{
#undef MAX
int m = MAX(2, 3);
printf("%d\n", m);
return 0;
}
?
命令行定义:允许在命令行中定义符号,用于启动编译过程。
? ? ? ? 当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候。?例如:在不同的机器位数确定不同的数组大小。
#include <stdio.h>
int main()
{
int arr[ARRAY_SIZE];// 可以在编译的过程中使用命令行参数来给数组的大小赋值
for (int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = i;
}
for (int i = 0; i < ARRAY_SIZE; i++) {
printf("%d ", arr[i]);
}
return 0;
}
条件编译:在编译一个程序时,将一条语句编译或者放弃编译。
常见的条件编译的指令:
1.
#if 常量表达式
//
#endif
2.多个分支的条件编译
#if 常量表达式
// ..
#elif 常量表达式
// ..
#else 常量表达式
// ..
#endif
3.判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
4.嵌套指令:
#if defined(OS_UNIX)
? ? ? ? #ifdef OPTION1
? ? ? ? ? ? ? ? unix_version_option1();
? ? ? ? #endif
? ? ? ? #ifdef OPTION2
? ? ? ? ? ? ? ? unix_version_option2();
? ? ? ? #endif
#elif defined(OS_MSDOS)
? ? ? ? #ifdef OPTION2
? ? ? ? ? ? ? ? msdos_version_ option2();
? ? ? ? #endif
#endif? ? ? ?
#include <stdio.h>
#define M 0
int main()
{
int i = 0;
int n = 10;
for (i = 0; i < 10; i++) {
#if M
printf("%d ", i);
#endif
printf("1 ");
}
return 0;
}
![]()
#include <stdio.h>
#define M 2
int main()
{
int i = 0;
int n = 10;
for (i = 0; i < 10; i++) {
#if M
printf("%d ", i);
#endif
printf("1 ");
}
return 0;
}
?![]()
#include <stdio.h>
#define M 150
int main()
{
#if M < 100
printf("less\n");
#elif M == 100
printf("equal\n");
#elif M > 100 && M < 200
printf("middle\n");
#else
printf("more\n");
#endif
return 0;
}

#include <stdio.h>
#define M 0
int main()
{
#ifdef M
printf("Mdefine1\n");
#endif
#if defined(M)
printf("Mdefine2\n");
#endif
#ifndef M
printf("Mnodef1\n");
#endif
#if !defined(M)
printf("Mnodef2\n");
#endif
return 0;
}

#include <stdio.h>
int main()
{
#ifdef M
printf("Mdefine1\n");
#endif
#if defined(M)
printf("Mdefine2\n");
#endif
#ifndef M
printf("Mnodef1\n");
#endif
#if !defined(M)
printf("Mnodef2\n");
#endif
return 0;
}
?
?头文件包含的方式:
本地文件包含:用双引号
? ? ? ? 查找策略:现在源文件所在目录下查找,如果头文件未找到,编译器就在标准位置查找头文件。
库文件的包含:用<>
? ? ? ? 查找策略:直接去标准路径下查找,找不到,返回错误
?防止一个文件被多次包含:
在每个头文件写
1.
#ifdef __TEST_H__
#deine __TEST_H_
//
#endif
2.
#pragma once
|
|
| C++知识库 最新文章 |
| 【C++】友元、嵌套类、异常、RTTI、类型转换 |
| 通讯录的思路与实现(C语言) |
| C++PrimerPlus 第七章 函数-C++的编程模块( |
| Problem C: 算法9-9~9-12:平衡二叉树的基本 |
| MSVC C++ UTF-8编程 |
| C++进阶 多态原理 |
| 简单string类c++实现 |
| 我的年度总结 |
| 【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
| c语言常见错误合集 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/28 22:19:43- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |