使用C/C++编译预处理时须要注意的问题
1、宏定义不是C/C++语句,不须要使用语句结束符“;”,否则它也被看做宏体的一部分。
2、不要在引用宏定义的參数列表中使用增量和减量运算符,否则将导致变量的多次求值。比如:
#define SQUARE(x) ((x) * (x))
int n1 = 5;
int m1 = SQUARE(n1++); //m1 = 25,n1 = 7 int n2 = 5;
int m2 = SQUARE(++n2); //m2 = 49,n2 = 7
3、带參数的宏体和各个形參应分别用括号括起来,以免造成意想不到的错误。比如:
#define SQUARE(x) x * x
int m = SQUARE(3 + 5); //将被扩展为m = 3 + 5 * 3 + 5
4、当不再使用某一个宏时,能够使用#undef来取消其定义,否则简单地删除宏定义会带来很多编译错误。
5、编译伪指令#error用于输出与平台、环境等有关的信息。比如:
#if !defined(WIN32)
#error ERROR: Only Win32 Platform supported!
#endif
#ifndef _cplusplus
#error ERROR: MFC requires C++ compilation!
#endif
当预处理器发现应用程序中未定义宏WIN32或者cplusplus时,把#error后面的字符序列输出到屏幕后即终止,程序不会进入编译阶段。
6、当须要临时放弃一段代码的时候,假设这段代码本身就含有块凝视时,使用块凝视屏蔽它就比較麻烦,此时可使用条件编译伪指令#if来屏蔽这段代码。比如:
#if 0
…//希望屏蔽的代码
#endif
注意:因为条件编译由编译预处理器来处理,显然预编译伪指令无法计算有变量參与当中的表达式或sizeof表达式,仅仅能用常量表达式。
7、编译伪指令#pragma用于运行语言实现所定义的动作,比如:
#pragma pack(push, 8) /*对象成员对齐字节数*/
#pragma pack(pop)
#pragma warning(disable:4069) /*不要产生第C4096号编译警告*/
8、构串操作符#仅仅能修饰带參数的宏的形參,它将实參的字符序列(而不是实參代表的值)转换成字符串常量。比如:
#define STRING(s) #s #s #s
#define TEXT(s) "class" #s "Infor"
int abc = 100;
STRING(abc) //展开为abcabcabc
TEXT(abc) //展开为classabcInfor
注意:不管#s之间有多少个空格展开后都将忽略。
9、合并操作符##将出如今其左右的字符序列合并成一个新的标识符(注意,不是字符串)。比如:
#include <stdio.h>
#define paster( n ) printf( "token"#n" = %d\n", token##n ) int main(void)
{
int token9 = 100;
paster(9); //输出token9 = 100 return 0;
}
注意:(1)C语言字符串中的两个相连的双引號会被自己主动忽略;(2)使用合并操作符时,产生的标识符必须预先有定义,否则编译器会报“标识符没有定义”的编译错误。
使用C/C++编译预处理时须要注意的问题的更多相关文章
- Verilog学习笔记基本语法篇(十二)········ 编译预处理
h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- c语言编译预处理和条件编译执行过程的理解
在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令.预处理命令属于C语言编译器,而不是C语言的组成部分.通过预处理命令可扩展C语言程序设计的环境. 一.预处理的工作方式 1.1. ...
- 如何在编译内核时添加缺少的固件(随着intel wireless 5100 AGN的 iwlwifi 案例)
我不知道你在笔记本使用 Linux 在内核编译无线wifi 不能用.我的书"关联 Y450"一个足够的旧书,随着无线网卡: $ lspci | grep Wireless 06:0 ...
- C++的编译预处理
C++中,在编译器对源程序进行编译之前,首先要由预处理对程序文本进行预处理.预处理器提供了一组预编译处理指令和预处理操作符.预处理指令实际上不是C++语言的一部分,它只是用来扩充C++程序设计的环境. ...
- C语言条件编译及编译预处理阶段(转)
一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的 ...
- VerilogHDL编译预处理
编译预处理语句 编译预处理是VerilogHDL编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理.以”`” (反引号)开始的某些标识符是编 ...
- 【转】C语言条件编译及编译预处理阶段
原文: http://www.cnblogs.com/rusty/archive/2011/03/27/1996806.html 1. 宏定义(宏代换,宏替换,宏: 宏定义是C语言提供的3中预处理功能 ...
- C++——多文件结构和编译预处理命令
[toc] 一.多文件结构 1.一个工程可以划分为多个源文件 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(main函数所在的.cpp文件) 2.利用工程来组合各个文件 //Poi ...
随机推荐
- hihoCoder #1174:拓扑排序·一
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 因为今天上课的老师讲的特别无聊.小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi ...
- Html5 Device API详解
三.四月曾学习过html5相关知识,并就html5 device api做过一次讲解 课程时长一个小时,预期达到level 200目标,即知道html5 device api是什么,且知道怎么实现 面 ...
- 辛星解读为什么PHP须要模板
近期有个人问我:为什么PHP须要模板呢?整个站点的编写都是我一个人完毕的,从前端到后端,都是这样,我一个人写站点是不是就不须要模板了呢?我当时还真给问住了,也没想好非常合适的回答它的方式,于是就随便说 ...
- memcached 分布式聚类算法
memcached 分布式集群,该决定必须书面开发商自己.和redis 由分布式server决定.上 memcached 有两个选项用于分布式.第一个是:模运算 另一种是:一致性hash 分布式算法. ...
- uIP中国的协议文件:Ch01
uIP0.9 参考 by Doxygen 1.3.3 Tue Oct 7 15:51:00 2003 译: fishOnFly(鱼在飞) uIP-refman中文pdf下载 第1章 uIP TCP/ ...
- zoj Reactor Cooling
Reactor Cooling 无源汇上下界最大流问题. 1.流量平衡. 2.满足上下界 模板题. #include <iostream> #include <queue> # ...
- [HTML5游戏开发]简单的《找没有同汉字版〗爆去考考您狄综力吧
[color=ize:18px]一,筹办工做 本次 游戏开发需求用到lufylegend.js开源游戏引擎,版本我用的是1.5.2(如今最新的版本是1.6.0). 引擎下载的位置:http: ...
- MySQL初步研究数据库
我用的是环境Win7.开始学习PHP和MySQL,而买了这<Head First PHP & MySQL>,从能Head First Labs官网获得HeadFirst系列书籍的相 ...
- 新项目架构从零开始(三)------基于简单ESB的服务架构
这几个月一直在修改架构,所以迟迟没有更新博客. 新的架构是一个基于简单esb的服务架构,主要构成是esb服务注册,wcf服务,MVC项目构成. 首先,我门来看一看解决方案, 1.Common 在Com ...
- 【原创】leetCodeOj --- Min Stack 解题报告
题目地址: https://oj.leetcode.com/problems/min-stack/ 题目内容: Design a stack that supports push, pop, top, ...