导航:首页 > 源码编译 > 添加预编译宏处理

添加预编译宏处理

发布时间:2023-03-27 22:48:15

A. 什么是预编译,何时需要预编译

预编译又称为预处理,是做些代码文本的替换工作

预编译又称为预处理,是做些代码文本的替换工作

处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等

就是为编译做的预备工作的阶段

主要处理#开始的预编译指令

预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。常见的预编译指令有:

(1)#include 指令

该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"cpp"的头文件。

注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。

(2)#define指令

该指令有三种用法:

第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用;

第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);

第三种是定义"函数",如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。

第四种是定义"宏函数",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用时,用GEN_FUN(int),则此处预编译后就变成了 max_int(int a,int b){return a>b?a:b;},以后就可以使用max_int(x,y)就可以得到x和y中较大的数.比第三种,增加了类型的说明。

(3)#if、#else和#endif指令

这些指令一般这样配合使用:

#if defined(标识) //如果定义了标识

要执行的指令

#else

要执行的指令

#endif

在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:

#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符,

//每个头文件的标识符都不应相同。

//起标识符的常见方法是若头文件名为"abc.h"

//则标识为"abc_h"

#define XXX

真正的内容,如函数声明之类

#endif

B. 预处理命令的宏定义

1.不带参数的宏定义:
宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define标识符文本
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为文本(这个文本可以是字符串、可以是代码等)。
掌握宏概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:
#define PI 3.1415926
把程序中全部的标识符PI换成3.1415926
说明:
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)可以用#undef命令终止宏定义的作用域
(4)宏定义可以嵌套
2.带参数的宏:
除了一般的字符串替换,还要做参数代换
格式:
#define 宏名(参数表)文本
例如:#define S(a,b) a*b
area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;
类似于函数调用,有一个哑实结合的过程:
(1)实参如果是表达式容易出问题
#define S(r) r*r
area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;
正确的宏定义是#define S(r) ((r)*(r))
(2)宏名和参数的括号间不能有空格
(3)宏替换只作替换,不做计算,不做表达式求解
(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
(5)宏的哑实结合不存在类型,也没有类型转换。
(6)宏展开使源程序变长,函数调用不会
(7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

C. 怎么在NDK的makefile加入预编译宏

一个程序使用宏:在代码中定义,在编译器编译的时候指定。所谓的makefile只是一个编译系统,最终还是调用编译器。
对于你的问题,在NDK的makefile中加入宏定义,换种说法是:如何给NDK的makefile添加编译选项,有一个LOCAL_CFLAGS就可以定义选项了(或许还有其他的xxxcflags的东西定义,具体就自己查手册)。
加入选项,如:-DMyMacro

ifeq ($(HOST_OS),linux)
LOCAL_CFLAGS := -DGCC
endif
lz要的是在这个吗

D. 怎么样为一个xcode的工程添加一个预编译的宏

C++builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了。除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多delphi程序员仍受不了c++builder工程的编译速度。的确,delphi的速度要比任和c++的编译器都要快好多。Delphi在编译一个小工程的时候可能不到一秒,大的工程一般也在5秒钟这内编译完成了。

E. C语言提供的预编译处理命令主要有哪三种

1.宏定义:用一个指定的标识符(即名字)来代表一个字符串,如:用PI代表3.1415926,#define PI 3.1415926
2.文件包含:指一个源文件可以将另外一个源文件的全部内容包含进来,#include<文件名>
3.条件编译:对一部分内容指定编译的条件,即满足一定的条件才编译,主要有:
(1)#ifdef标识符
程序段1
#eles
程序段2
#endif
(2)#ifndef标识符
程序段1
#eles
程序段2
#endif
(3))#if标识符
程序段1
#eles
程序段2
#endif

F. vs2008添加预编译命令

以预编译头文件为Stdafx.h为例:
Qt Creator中很简单,只需在.pro文件中加入一行PRECOMPILED_HEADER = stdafx.h
VS2008在工程中在Stdafx.h文件上右键propertis-Configuration Properties-C/C++-Precompiled Headers-Create/Use Precompiled Header中选择Create Precompiled Header(/y).
有一点注意的是,在工程Generated Filed中的moc相关文件也需要选上Use Precompiled Header (/Yu).

G. word中录制新宏的具体操作步骤是什么

材料/工具:word2010

1、打开一个word文档,而后在文档中输入文字,并选中而后在上方功能区找到开发工具菜单

H. ios cocoapods怎么添加预编译宏

ALT+F11打开VBE编辑器,将代码放进去,运行(单击工具----宏---宏找到这代码的名字运行就可以了)

I. 不支持的sdk调用怎么办

刚才说了,出现在这种问题是集成了第三方的SDK,该SDK不支持模拟器运行。其实,再问题具体一点,是因为这类SDK不支持在x86下编译的话,则不能在模拟橡樱虚器上调试运行。
二、解决这种问题的思路。
  其实,解决这类问题的方法就是四个字:条件编译。利用条件编译,在梁燃模拟器环境下不对不支持x86的SDK进行编译即可。
  对于有些SDK提供了两套版本,一套Release环境,一套Debug环境。Debug环境支持在模拟器进行,对于这类SDK,则可以通过替换SDK的framework的方式来解决模拟器调试问题。比如阿里云短视频SDK,七牛视频播放SDK等等。
三、具体解决问题的方法。
  我们要设置一个预编译宏,来处理条件编译,比如设置一个预编译宏,名字叫EZDISABLE。在Target的Build Settings选项卡下面,我们找到Preprocessor Macros项,双击后增加一项:EZDISABLE=1。可以只在Debug或者只在Release加入该宏,具体依据你自己的需求而定。这里我都加入了。
  下面,就是将用到不支持x86的SDK的调用,通过EZDISABLE宏“隔离”开。在我这个项目中,需要把萤石云的SDK“隔离”。
  代码可能分散的比较多,需要耐心的一个个把他给去掉。
  上面还说了,有些SDK分Release和Debug两个版本,Debug支持模拟器编译。对于这类,如果你的SDK是通过手工添加的方式来集成的话,那你就手工一个个一个把SDK给替换了,如果你用的是cocoaPods的话,那一般只需要将Podfile的引用稍作修改既可以。我这个用的是cocoaPods来集成的七牛视频播放SDK。我将Podfile文件修改成下面的即可:
  有时候,我们为了方便代码的复用,做了很多的私有Pod子库提供给主项目集成。如果在这些私有库中引用了类似七牛这种SDK该怎么办?其实我们根据cocoaPods的规则,完全可以不用考虑子库,直接在主工程的Podfile文件将SDK的引用改了就行。cocoaPods会自动处理这类依赖,非常方便。
四、问题优化。
  在上面,已经基本上解决了如何在模拟器上编译的问题。但是不太方便,我们总不能每次切换真机与模拟器的时候,都去修改一下预编译宏和Podfile文件吧?
  具体该怎么进行优化可以让我们方便的切换调试环境呢?
  对于预编译宏的设置,我们可以通过再设置一个Target的方式来处理,我们将工程的Target复制一个,比如原工程Target名字为:BBTSer。复制的一个改名为:BBTSer Simulator。我们只在BBTSer Simulator的Build Settings选项卡中的Preprocessor Macros增加预编译宏EZDISABLE=1。原来的老Target不变。如果用cocoaPods的话,在增加了一个新的Target后要相应的修改一下Podfile文件来增加对这个Target的支持。这样,就可以通过切换Target的方式来处理真机与模拟器的调试切换。
  再说下Podfile文件的优化。上面讲了,对于七牛的SDK官方支持了在模拟器调试,但是是不同的pod库地址。需要进行切换。那么我们如何能够使cocoaPod能够以一种相对自动的方式来处理这种切换呢?这需要我们更加的了解Podfile的语法才行。首先,在上面我们建立了两个Target。所以Podfile文件要同时处理两个Target的集成。然后,对于不同的Target有可能要集成不同的七牛SDK地址,如何在pod install的时候来处理这种不同?
  对于第一个问题其实很简单,网络一下很多方式,这里不在叙述。对于第二个问题需要说一下。在Podfile中,如果两个或者多个Target引颂乱用了相同的pod库,但是源文件地址不一样的话,是会报错的。那么我们就需要增加一个开关来处理一下,如果开关打开,则引入正常地址,如果开关关闭则引入另外一个地址。我们知道,Podfile文件的语法其实跟Ruby差不多。所以,我们可以增加一个变量release,然后通过判断release变量是false还是true来引入不同的源地址。这样,我们的Podfile文件就变成了如下行使。
source'https://github.com/CocoaPods/Specs.git'platform:ios,'8.0'inhibit_all_warnings!#开关变量release=false# abstract_target:抽象target。内部包含两个Target:BBTSer和BBTSer Simulator。这两个Targe继承这个抽象target。抽象target的名字可以随意定义,这里我定义成BBTabstract_target'BBT'do......ifreleasethentarget'BBTSer'dopod"PLPlayerKit"endelsetarget'BBTSer Simulator'dopod"PLPlayerKit",:podspec=>'https://raw.githubusercontent.com/pili-engineering/PLPlayerKit/master/PLPlayerKit-Universal.podspec'endendend
到了这里,我们在每次切换模拟器和真机的时候,只要把release的状态改一下就可以了,真机改成true,模拟器改成false。然后在pod install或者pod update。你可能会说,这样也不好。每次还要改Podfile文件。那么好,我再加一个shell脚本,来帮着我们处理这个改动,不要每次都改Podfile文件了,省的不小心改错了。shell文件起名为podinstall.sh。内容如下:
#!/bin/bash file="Podfile" if [ ! -f "$file" ]; then echo '没有找到Podfile文件' exit fi if [ ! -n "$1" ] ;then echo "请输入参数。真机调试以及发布到AppStore请输入release,模拟器调试输入debug" exit fi MODE=$1 if [ "$MODE" != "release" ] && [ "$MODE" != "debug" ];then echo "请输入正确的参数。真机调试以及发布到AppStore请输入release,模拟器调试输入debug" exit fi echo "当前集成环境:$MODE" podmodel="release=false" if [ "$MODE" == "release" ];then podmodel="release=true" fi echo $podmodel # sed -i "s/release=true/$podmodel/g" # sed -i '' '/release=true/$podmodel/g' $file sed -i '' "s#release=true#$podmodel#g" $file sed -i '' "s#release=false#$podmodel#g" $file #更新pod配置 echo "********************************************" echo "* 配置完毕,开始Pod集成 *" echo "********************************************" pod install

阅读全文

与添加预编译宏处理相关的资料

热点内容
土方标高计算法 浏览:592
家教高级教程女演员叫什么 浏览:360
日本日本翻译汉语电影 浏览:491
言情动漫免费 浏览:40
安卓手机图像变黑白色了怎么办 浏览:279
linux查看用户和密码 浏览:976
穿书荒岛:女主把我奶上天小说 浏览:156
主角能看见别人气运的小说 浏览:577
求一个不用下载播放器的网址 浏览:686
免费在线国产小电影 浏览:544
尺度大的女同电影 浏览:371
纯爱高干生子的小说 浏览:879
linux开发服务端 浏览:962
不要VIP的电视网站 浏览:780
看欧美出轨的.看欧美出轨的女人 浏览:872
linuxsignal函数 浏览:248
你的名字 国语 下载 浏览:280
银河麒麟下编译qt源码 浏览:163
读单片机的flash 浏览:839
安全不收费的看片网站 浏览:945