预处理指令

C语言——预处理指令 return 0;这里是可以编译通过的,运行结果也是对的:;;return 0;这里编译器会报错:这里是有语法错误的。在C语言中,#include是一个预处理指令,用于将一个源文件的内容插入到另一个源文件中。这通常用于包含标准库或自定义库的头文件,以便在程序中使用这些库中定义的函数、类型和宏。#include或:用于包含标准库头文件。查找策略是,编译器会在标准库头文件目录中查找这些文件。:用于包含用户自定义的头文件。 阅读详情
  1. 什么是预处理指令

程序设计语言的预处理的概念:在编译之前进行的处理

预处理指令是我们写在程序代码中的给预处理器(preprocessor)的 命令,而不是程序本身的语句。预处理器在我们编译一个C++程序时由编译器自动执行,它负责控制对程序代码的第一次验证和消化。

 

特点:

所有这些指令必须写在单独的一行中,由#开头,它们不需要加结尾的分号;。

二.  c++的预处理指令

c/c++语言的预处理主要有一下几个方面的内容:

 1.宏定义:#define、#undef

 2.文件包含:#include

 3.条件编译:#ifdef、#ifndef、#if、 #endif、#else、#elif

 4.布局控制:#error、#pragma

 预处理命令以符号“#”开头。

 

详解

使用说明&常见误区

#define 

宏定义是简单的替换,即将宏名替换为对应的字符串

a.简单的替换(#define <宏名> <字符串>)

#define MAX 100

  在编译前,所有使用宏名MAX的地方都会被替换为100
b.
带参数的宏替换(#define <宏名> (<参数表>) <宏体>)

#define MaxNum(a,b) a>b?a:b

     可以用来宏定义函数

 

使用宏替换常量,例如在TCP编程中端口号

很方便程序的修改,而且将常量变成了有意义的字符,也提高了程序的可读性

#define N  2+2

 

对于语句:

int a=N*N

a的值为8,实质上N*N等于2+2*2+2,而非4*4,在替换过程中只是文本替换,而不会有计算

#undef

作用与#define相反,取消对传入的参数的宏定义

#define MaxNum(a,b) a>b?a:b

#undef MaxNum

 

此时就不能在程序中使用宏名MaxNum

#ifdef, #ifndef, #if, #endif, #else, #elif

个人觉得这些指令可以分为同一类,都是在某种条件下忽略程序的某部分代码

 

#ifdef MAX

// code

#endif

只有在MAX已定义的情况下,code所代表的部分代码才会被编译器编译

 

#if MAX>200

      code

#endif

只有在MAX>200的情况下,code所代表的部分代码才会被编译器编译

 

#else同

而#elif=#else if

 

 

在开发可移植、多平台的程序时经常使用

#error

使用格式

#error [用户自定义的错误消息]

当预处理器处理到#error命令时将停止编译并输出用户自定义的错误消息

eg:

#include <iostream>

using namespace std;

 

#ifndef MAX

#error not define MAX

#endif

 

int main(int argc, char* argv[])

{

cout << "This is a test!" << endl;

return 0;

}

此程序在编译时会输出error C1189: #error :  not define MAX        

编译停止

 

#include

        对任何一个c/c++程序员来说,这都是一个非常熟悉的命令。当预处理器找到一个#include 指令时,它用指定文件的全部内容替换这条语句。声明包含一个文件有两种方式:

#include "file"

#include <file>

         两种表达的唯一区别是编译器应该在什么路经下寻找指定的文件。第一种情况下,文件名被写在双引号中,编译器首先在包含这条指令的文件所在的目录下进行寻找,如果找不到指定文件,编译器再到被配置的默认路径下(也就是标准头文件路径下)进行寻找。

         如果文件名是在尖括号 <> 中,编译器会直接到默认标准头文件路径下寻找。

    一般来说,如果是自定义头文件会使用"",而官方的头文件用<>

未防止头文件多次引用:

方法一:

eg:test.h

#ifndef TEST_H

#define TEST_H

...... // 一些声明语句

#endif

该方法依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

 

方式二:

#pragma once

... ... // 一些声明语句

#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

 

一般来说,使用第一种方法较多,因为二种方法可能受编译器限制,而第二种是语言特性,不受编译器限制,可移植性较好

#pragma

         这条指令可以说是所有预处理指令中最复杂的一个指令

         作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。所以可能有些用法会出现可移植性差的情况

         使用格式:

          #pragma Para     其中Para 为参数

 

常见用法:

#pragma once

只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,不过可移植性较差

 

#pragma message("消息文本")

当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

 

 

 

C# 预处理器指令 预处理器指令(Preprocessor Directives)指导编译器在实际编译开始之前对信息进行预处理。通过这些指令,可以控制编译器如何编译文件或编译哪些部分。常见的预处理器指令包括条件编译、宏定义等。所有的预处理器指令都是以 # 开始,且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号;结束。C# 编译器没有一个单独的预处理器,但是,指令被处理时就像是有一个单独的预处理器一样。在 C# 中,预处理器指令用于在条件编译中起作用。 阅读详情

相关推荐

同花顺Supermind量化交易 技术面分析专题(一)-- 相似k线的形态验证与选股

W底”,“多头上涨”,“趋势回踩”,”上涨中继“这些都是常见的K线形态,以”上涨中继“为例,当股价快速上涨后,出现盘整形态而非顶部形态,预示股价还会进一步上涨,那么本节主要讲述”上涨中继”形态是否能够预测未来股价上涨,以及如何应用“上涨中继”形态,来快速选股。"相似K线"技术相比于传统的K线组合而言更具技术性,其还有较多的运用空间,比如:运用顶部形态来监控个股潜在的下跌风险,运用相似度来监控个股是否脱离大盘走势,研究各类形态的上涨预测能力,并应用于选股等等。第一步:选取一段标准的“上涨中继”形态K线图。

qq_22808537的博客 4550

预处理指令详解(C语言)

经过预处理后,stuff会被直接替换为·name。若stuff的内若过长,可在句末加上return 0;数值替换return 0;循环替换while(1) {} return 0;运行代码,将会在屏幕上死循环地打印A。分支替换,其中,list是由逗号隔开的符号表,符号有可能出现在stuff中。return 0;return 0;因为#define。由于宏是直接替换,因此传参时严禁使用自增,自减,传参时使用,替换后依然会再次执行,会导致不可预测的后果。

2301_76310669的博客 1592

矩形口径喇叭天线设计——参数设置

我们建立好矩形口径喇叭天线的模型后(模型建立可参考B站相关视频或者李明洋的《HFSS天线设计》),如何修改参数达到我们的指标呢?

m0_57263863的博客 1万+

C学习笔记之预处理指令

---------------------- IOS开发、Android培训、期待与您交流! ---------------------- 一、什么是预处理指令            预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包含,条件编译。 预处理指令一般以 # 号开头,可以出现在文件的任何地方,作用于整个文件。  二、宏定义         宏定义分不带参

小桥 1170

CAN:CANape使用Function处理数据

CANape中的function and script习惯称之为脚本(实际为函数和脚本)。这里介绍function,可以实现简单信号a和信号b乘法,比如计算功率(转速与扭矩乘)。该功能前期有专业人员做支援,当时问其编制方法,其回答是看帮助文件。现在没有支援自己动手。 功能描述:电压信号阶梯增加,每次保持1.5s,测量后0.5s位移平均值(假设信号步长10ms,需要取样50个点,但该脚本中点的数目为10个)。图示如下: 刚开始看了软件Function definition→Library function,

Morven 1万+

Diffusion models代码实战:从零搭建自己的扩散模型

这个系列曾经写过三篇文章专门讲代码,分别从数据集、超参数、loss设计、参数计算、Unet结构、正向过程、逆向过程等部分详细介绍了如何搭建DDPM。Diffusion models领域发展神速,最近半年代表作品有OpenAI的GLIDE、DALL-E 2,Google Brain的ImageGen,海森堡大学的Latent Diffusion。这篇博客针对入门新手讲解一下如何利用已有的资源快速搭建自己的Diffusion models。.........

沉迷单车的追风少年 1万+

c语言拾遗03--预处理指令

文章目录一.预处理指令      1.1 什么是预处理指令      1.2 哪些是预处理指令      1.3 预处理指令的分类二.宏定义      2.1 不带参数的宏定义      2.2 带参数的宏定义三

小梁 396

RK356x U-Boot研究所(命令篇)3.10 bidram与sysmem相关命令的作用

RK356x U-Boot研究所(命令篇)3.10 bidram与sysmem相关命令的作用

Systemcall名屋 624

【C语言】预处理指令

C语言预处理指令介绍

白码王子小张的博客 878

【异常】OpenAI提示内容有误 Invalid prompt: your prompt was flagged as potentially violating our usage policy.

用户需优先调整提示内容,确保符合OpenAI的使用政策。若问题持续,建议结合请求ID和具体代码示例联系官方支持。同时,可参考腾讯云、Microsoft Q&A等平台提供的错误处理实践(如重试机制、日志记录)优化代码健壮性。

奶爸的编程之路,也就一周冷个三天 2081

华为OD机考双机位C卷 - 简单的解压缩算法 (Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 简单的解压缩算法 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 130

预处理指令详解

预处理指令详解一、预定义符号二、define的用法1.定义标识符2.读入数据总结 预处理指令包括: #define 、#include、#ifdef、#else、#ednif、#ifndef、#if、#elif、#line、#error、#pragma,下面我们一 一介绍。 一、预定义符号 预定义符号 含义 _FILE_ 进行编译的源文件信息 _LINE_ 文件当前的行号 _DATE_ 文件被编译的日期 _TIME_ 文件被编译的时间 _STDC_ 如果编译器遵循ANSI

m0_54489492的博客 2522

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

常用预处理指令

文章目录一、条件编译1.#if指令2.#endif3.#ifdef和#ifndef4.#else指令5.#elif指令二、其他一些标准指令1.#pragme 预处理指令是以#号为代码开头。下面是部分常用的预处理指令: 指令 用途 # 空指令无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下

qq_43630810的博客 5135

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++ 中常见的预处理指令总结

include用于包含头文件,是代码模块化和代码重用的基础。#define定义各种宏,包括常量和函数式宏,但要注意宏的副作用和潜在问题。条件编译指令#ifdef#ifndef#if#elif#else#endif用于根据宏的状态或条件表达式来控制代码的编译。#pragma提供编译器特定的指令,用于调整编译器的行为,但可移植性可能受限。其他指令#undef#line#error用于取消宏定义、调整编译器信息和生成编译错误。

行知SLAM 1478

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C/C++预处理指令

C/C++常见的预处理指令如下: C/C++编译系统编译程序的过程为预处理、编译、链接。预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序。预处理器指令以#号开头标识,末尾不包含分号。预处理命令不是C/C++语言本身的组成部分,不能直接对它们进行编译和链接。C/C++语言的一个重要功能是可以使用预处理指令和具有预处理的功能。C/C++提供的预处理功能主要有文件包含、宏替换、条...

沸腾的石灰 2594

预处理指令的开始和结束

文章目录1 空白字符2 预处理指令的开始和结束 1 空白字符 要想搞清楚预处理指令的开始和结束,首先得搞清楚空白字符的概念。 空白字符是以下字符的统称 : 空格符 --> \x20(注意:空格符是可打印字符) 水平制表符 --> \t 换行符 --> \n 垂直制表符 --> \v 换页符 --> \f 2 预处理指令的开始和结束 预处理指令的开始与结束: 以...

木子皿--啥都不会的菜鸟 1459

预处理指令的疑惑

用到预处理指令了就查阅msdn学习并参照例子练习了下。暂时先记录下遇到的问题。1。预处理指令不预先定义debug模式下#debug 则一直为true即使注释掉也能使用其他预处理指令如果不预先声明,直接判断结果不出错但是判断结果为false2.在release下 Console.WriteLine函数无法使用#define DEBUG#define VC_V7using System

blue_maple的专栏 1455

预处理指令(Preprocessor directives)

要定义预处理宏,可以使用#define。当预处理器遇到该指令时,它会在代码的其余部分中将所有identifier替换为。这个可以是一个表达式、语句、代码块或任何内容。预处理器不理解真正的 C++ 语法,它只是简单地将所有identifier替换为。100在预处理器替换了TABLE_SIZE#definea : ba : ba : ba : b?a : ba : b这将替换所有带有两个参数的getmax// 函数宏。

Leon_Chenl的博客 1467

C语言预处理指令

C语言预处理指令

init33的博客 1191
上一篇: c++函数调用规则
下一篇: LeetCode 73. Set Matrix Zeroes(Medium)
彼得.攀
博客等级 码龄11年 11粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值