在开发中经常会遇到需要条件编译一段代码,即: #ifdef DEBUG { 如果定义了DUBUG,则执行此段代码!} #else {否则执行此段代码!} 这就需要通过宏开关来进行条件编译,也就是常说的编译开关. 下面给出详细的代码实现. //hello.c #include<stdio.h> void main() { #ifdef DEBUG printf("#ifdef DEBUG is running!\n"); #else printf("#else is…
本文转载自:http://blog.csdn.net/maopig/article/details/7230311 在源代码里面如果这样是定义的:#ifdef   MACRONAME//可选代码#endif 那在makefile里面gcc   -D   MACRONAME=MACRODEF或者gcc   -D   MACRONAME 这样就定义了预处理宏,编译的时候可选代码就会被编译进去了. 对于GCC编译器,有如下选项:        -D macro=string,等价于在头文件中定义:#d…
本文转载自:https://github.com/zzb2760715357/document/blob/master/android_doc/Android.bp%E6%B7%BB%E5%8A%A0%E5%AE%8F%E5%BC%80%E5%85%B3.md#androidbp-%E6%B7%BB%E5%8A%A0%E5%AE%8F%E5%BC%80%E5%85%B3 Android.bp 添加宏开关 平台: android 8.1 + mt6739 作者: 李强 日期: 2018-04-18…
实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解释器用的,对所编译的文件完全没有作用.   MSTAR:宏定义方式:字串定义方式和值定义方式 CC_TVOPTS += -DMS_BOARD_TYPE_SEL=$(BOARD_TYPE_SEL) CC_TVOPTS += -DMS_SW_CUS_SEL=SW_CONFIG_TRUNK_ATVMM C…
原文地址:http://blog.csdn.net/cp1300/article/details/7773239 我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下.所以,很多人会选择使用宏定义的方式来输出调试语句. 比如,定义一个宏开关: #de…
多数c语言的初学者对c工程开发过程各个阶段的作用理解不到位,而这方面的的知识又是实际开发过程中经常用到的技能点,所以就成为面试考察中一个重要的考察方面.例如:头文件的作用.头文件的内容:链接的作用和意义:条件编译的作用等等此类问题,接下来将c工程开发过程中的各种问题进行总结使大家能够自如应对这方面的面试题目. c工程开发经过以下几个阶段:           编辑-->预处理-->编译-->汇编-->链接-->运行-->调试 预处理阶段通常要完成三件事情,用头文件内容替…
预处理:也就是包括须要的头文件,用#include<标准头文件>或#include "自己定义的头文件" 宏定义,如:#define PI 3.1415926 查看用宏定义的值替换宏名称,如:gcc -E test.c 带參数的宏:MAX(x,y) (x)>(y)? ((x):(y))   //用法与函数一样 宏运算:     #define PRINT(n) printf(#n"=%d",n)   //#n 就是把传入的变量值作为字符串放在那里…
在源代码里面如果这样是定义的: #ifdef   MACRONAME //可选代码 #endif 那在makefile里面 gcc   -D   MACRONAME=MACRODEF 或者 gcc   -D   MACRONAME 这样就定义了预处理宏,编译的时候可选代码就会被编译进去了. 对于GCC编译器,有如下选项:         -Dmacro=string 或 -D macro=string,等价于在头文件中定义:#define   macro   string.例如:-D TRUE=…
在Makefile中我们可以通过宏定义来控制源程序的编译.只要在Makefile中的CFLAGS(变量名随意)中通过选项-D来指定你于定义的宏即可. 如:CFLAGS += -D _YUQIANG在编译的时候加上此选项就可以了: $(CC) $(CFLAGS) $^ -o $@ 例如: Makefile文件内容为: CC = gcc RM = rm CFLAGS += -D _YUQIANG TARGETS := myapp all:$(TARGETS) $(TARGETS):main.c $(…
CUR_DIR = $(shell pwd) CFLAGS = -g -Wall GCC = gcc GXX = g++ TARGET = exe.out SRC_FILES += $(shell find $(CUR_DIR) -name *.cc) \ += $(shell find $(CUR_DIR) -name *.cpp) OBJS = fatal-impl.o log.o INCLUDE += -I. RM = rm -f LINK = CFLAGS = -DNS3_LOG_ENA…
/* * 宏的写法,宏的作用域,当前位置开始到大括号结束,如果没有大括号,到文件结尾. */ #include <stdio.h> //#define HELLO int main(int argc, const char * argv[]) { // insert code here... #ifdef HELLO printf("Hello, World!\n"); #else printf("fjdla\n"); #endif #define HE…
一.GCC编译器中使用:        -D macro=string,等价于在头文件中定义:#define   macro   string. 例如:-D TRUE=true,等价于:#define   TRUE   true        -D macro,等价于在头文件中定义:#define   macro   1,实际上也达到了定义:#define   macro的目的. 例如:-D Linux,等价于:#define   LINUX   1(与#define   LINUX作用类似).…
宏表达式在预编译期被处理,编译器不知道宏表达式的存在. 宏表达式没有任何的调用开销 宏表达式中不能出现递归定义. C语言中强大的内置宏 __FILE__:被编译的文件名 //双底线 __LINE__:当前行号 __DATE__:编译时的日期 __TIME__:编译时的时间 __STDC__:编译器是否遵循标准C规范 eg:printf("%s,%d Enter main()...\n",__FILE__,__LINE__); 注意:宏定义对空格比较敏感 #define f (x) ((…
实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解释器用的,对所编译的文件完全没有作用.   MSTAR:宏定义方式:字串定义方式和值定义方式 CC_TVOPTS += -DMS_BOARD_TYPE_SEL=$(BOARD_TYPE_SEL) CC_TVOPTS += -DMS_SW_CUS_SEL=SW_CONFIG_TRUNK_ATVMM C…
本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代码形式发布的包(一般为.tar.gz或.tar.bz2格式),我们可以用 ./confiugure.make.make install来编译安装,其中在运行./configure的时候还可以根据自己的需要加入不同的参数(可用./configure --help来查看参数表). 先说说执行./conf…
c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define            定义一个预处理宏#undef            取消宏的定义 #if                   编译预处理中的条件命令,相当于C语法中的if语句#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句#ifndef            与#ifdef…
makefile是为组织程序工程的,其定义的宏怎样应用到c程序中呢? 我们知道Makefile中可定义变量或导出变量,make命令可定义变量:编译器(如gcc)可通过CFLAGS定义宏. 但如何才能使Makefile或make命令用变量控制C程序呢? C程序可以接收编译器定义的宏,通过-D指定.makefile中将make命令或makefile中变量通过编译器-D参数传递到C程序是关键. 宏定义使用前缀-D,在编译过程中可以把宏定义追加到CFLAG中.宏定义有两种相似的写法 [第一种]-D DE…
什么是Makefile? 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令.   为什么要使用Makefile? 就像前面提到的,一个工程的源文件可能不计其数,编写makefile,使用make命令来构建工程,会使原本复杂繁琐的工作简化许多,极大地提高了效率.   如…
带参宏有时候可以代替函数作用:优点直接替代,省去函数调用过程的开销:但缺点也是很明显:容易出错,系统不做检查非常容易出错. 改进方案:内联函数:既有带参宏的直接替代(拷贝)的优点,又有系统检查的优点. 使用要求:代码小于10行,不能有分支和循环结构,和递归调用,这样才能保证拷贝的开销小于函数调用(系统堆栈)开销.调用和声明一致. 宏的模块调试和跨文件问题: 我们在调试不同驱动模块的时候,经常要进行模块级的局部调试,这时候一般通过宏定义和条件编译进行调试.但如果定义的开关宏在main.c中,而XX…
1. configure.ac和Makefile.am的格式解析概述 1.1. Autotools相关工具链 1.1.1. Autotools 1.1.2. 其他相关工具 1.2. 工具链的流程 1.3. autoconf 1.3.1. configure.ac文件 1.3.2. configure.ac文件的标准布局 1.3.3. configure.ac常见宏说明 1.3.5. 常用变量 1.3.4. 关于自定义宏 1.4. automake 1.4.1. Makefile.am文件 1.4…
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码):另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便. 本文主要分为三部分:第一部分讲述namke工具使用makefile的用法:第二部分讲述makefile的主要语法:…
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.Makefile makefile用来定义整个工程的编译规则.一个工程中的源文件计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚…
本文目录 iOS宏的经典用法 Apple的习惯 __attribute__ iOS宏的经典用法 1.常量宏.表达式宏 #define kTabBarH (49.0f) #define kScreenH [UIScreen mainScreen].bounds.size.height #define isScreenWidthEqual320 (fabs([UIScreen mainScreen].bounds.size.width - 320) < DBL_EPSILON) 2.带参数的宏 //…
make命令以及makefile使用RCS与CVS进行源代码控制编写手册页使用patch与tar发布软件开发环境 多源代码的问题 当我们编写小程序时,许多人都是简单的在编辑后通过重新编译所有的文件重新构建我们的程序.然而,对于大程序,这种简单构建方法的问题就变得明显了.编辑-编译-测试的循环时间将会变长.即使是最为耐心的程序员也会希望避免当只修改一个文件时而编译所有的文件. 当创建多个头文件并且在不同的源文件中包含多个头文件时就会出现一个更为困难的问题.假设我们有三个头文件a.h,b.h以及c.…
//#if 条件编译 //一般用于产品各个版本的语言包 #include<stdio.h> #include<stdlib.h> //#都是预处理指令,条件表达式必须在预处理里面 //所以条件表达式必须是宏表达式 //双分支条件编译 //#if 条件表达式 //代码段1 //#else //代码段2 //#endif //#endif结束条件编译 //#if,#else和C语言里的if else功能一样,但是时间开销不一样 //if else会编译所有的代码,源码会较长,编译时间会…
Linux就这个范儿 第8章 我是Makefile P287 Makefile的作用就是——自动化编译,一旦写好,只需要一个make命令(解析Makefile,执行Makefile中描述的操作),整个工程就能完成自动编译,无论这个工程拥有多少个源代码文件.Makefile定义了一系列的规则,来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个shell脚本一样,其中也可以执行操作系统的命令. 最典型的就是在微软的Visual…
  前言: 大家在Windows上使用VS构建C/C++程序时,不需要自己编辑略显晦涩的Makefile文件,而对于初学者而言, 他们甚至没意识到它的存在.VS是自动生成Makefile文件, 并构建工程项目的.不可否认Visual Studio做为一款全能的IDE,它帮开发者做了很多工作,也降低了C/C++的门槛,意义非常的重大. 但作为进阶的C/C++开发者, 你是有必须了解底层编译和链接原理的. 让我们来梳理下C/C++的编译链接过程,并回顾Makefile的编写规则,最后让我们来尝试实现…
目录(?) C/C++ 预定义宏^ C/C++ 预定义宏用途:诊断与调试输出^ CRT 和 C 标准库中的宏^ NULL 空指针^ limits.h 整数类型常量^ float.h 浮点类型常量^ math.h 数学常量^ EOF 常量^ errno.h 错误代码^ locale 类别^ _MAX_PATH 等文件名与路径长度限制^ RAND_MAX 随机数最大值^ va_arg/va_start/va_end 访问变长函数参数^ 宏实现的 CRT 函数^ Microsoft 预定义宏^ 平台与…
目录(?)[-] 简单宏定义 带参数的宏 运算符 运算符 宏的通用属性 宏定义中圆括号 创建较长的宏 较长的宏中的逗号运算符 宏定义中的do-while循环do 空操作的定义 预定义宏 C语言中常用的宏 1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define  标识符 替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标点符号.当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”的记录.在文件后面的…
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了. 在本文中,将给大家介绍如何使用 autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”,“make”,“make install”就可以把程序安装到Linu…