C语言学习11:typedef和define区别,头文件的使用以及 <>和“”区别,宏定义中#和##的用法,条件编译,gcc和c99中宏定义使用printf和sprintf,条件编译避免头文件包含
2013-10-07 11:45
971 查看
1,typedef和define区别
结果:
2,头文件的使用以及<>和“”的区别
结果:
3,宏定义中#和##的用法
结果:
4,条件编译
结果:
5,gcc和c99宏定义中使用printf和sprintf,
结果:
6,条件编译避免头文件包含
条件编译避免头文件包含
-->
7,宏定义实现函数功能
结果:
#include <stdio.h> #define INT32 int #define COUNT 10 //typedef 是编译器关键字,和#define是完全不同的 //typede 是会令编译器做类型推导, //#define 是预处理关键字,预处理后即处理完毕 typedef int int32; //带参数宏(按照参数进行宏替换) #define max(a,b) (((a)>(b))?(a):(b)) int main(void) { int i; INT32 a=3; int32 b=5; int m; for(i=0;i<COUNT;i++) printf("%d ",i); putchar('\n'); m=max(a+3,b-1); printf("m=%d\n ",m); return 0; }
结果:
will@will-laptop:~/ex/10$ ./a.out 0 1 2 3 4 5 6 7 8 9 m=6
2,头文件的使用以及<>和“”的区别
C文件: //#include<>搜索系统默认目录(/usr/include /usr/local/include gcc指定目录) //#include“”搜索源文件当前目录,然后搜索系统默认目录 //<>或者“”内是头文件路径(相对路径 /绝对路径) #include </usr/include/stdio.h> #include "headerfile/123.h" int main(void) { printf("hello!\n"); printf("max=%d\n",max(6,7)); return 0; } H文件:123.h #define max(a,b) ( (a>b)?(a):(b))
结果:
will@will-laptop:~/ex/10$ ./a.out hello! max=7
3,宏定义中#和##的用法
#include<stdio.h> //#将传入参数名转换成加上“”的参数名字符串 #define tostring(s) #s //##连接字符串 #define stringcat(s1,s2) s1##s2 #define stringcat1(s1,s2) s1+s2 int main(void) { printf("%s\n",tostring(12345)); printf("%d\n",stringcat(123,456)); printf("%d\n",stringcat1(123,456)); return 0; }
结果:
will@will-laptop:~/ex/10$ ./a.out 12345 123456 579
4,条件编译
#include <stdio.h> //#define DEBUG //定义与未定义产生不同的结果,三个语句就是一套 //就是#ifdef #else #endif int main(void) { #ifdef DEBUG printf("this is a debug version!\n"); #else printf("this is a release version!\n"); #endif #if 1 printf("macro condition is true!\n"); #else printf("macro condition is false\n"); #endif return 0; }
结果:
will@will-laptop:~/ex/10$ ./a.out this is a release version! macro condition is true!
5,gcc和c99宏定义中使用printf和sprintf,
#include <stdio.h> //"调用"宏时,变参部分参数不能为空 //GCC扩展功能 #define debug(msg,args...) \ printf(msg,args) //C99 的用法 #define debug1(msg,...) \ printf(msg,__VA_ARGS__) //"调用"宏时,变参部分参数可以为空 //GCC扩展功能 #define info(msg,args...) \ fprintf(stderr,msg,##args) //C99 的用法 #define info1(msg,...) \ fprintf(stderr,msg,##__VA_ARGS__) int main(void) { int a=3,b=5; debug("a=%d,b=%d\n",a,b); debug1("a=%d,b=%d\n",a,b); printf("----------------------------\n"); info("12312312312312312\n"); info1("a=%d,b=%d\n",a,b); return 0; }
结果:
will@will-laptop:~/ex/10$ ./a.out a=3,b=5 a=3,b=5 ---------------------------- 12312312312312312 a=3,b=5
6,条件编译避免头文件包含
条件编译避免头文件包含
-->
//条件编译的应用 //防止头文件包含 //如果出现两个头文件都包含同样的一个头文件就需要用到这个东西 #ifdef _HEADER_PROTECT_H_ #define _HEADER_PROTECT_H_ //中间可以放你的文件 #endif /*_HEADER_PROTECT_H_*/
7,宏定义实现函数功能
#include <stdio.h> //宏定义的高级应用 #define swap(a,b) do { \ typeof(a) __t; \ //typeof可以跟变量和表达式,取变量和表达式值的类型 __t=a; \ a=b; \ b=__t; \ }while(0) int main(void) { int a=3,b=5; //typedef:gcc typeof(a) flag=1; printf("before swap:a=%d,b=%d\n",a,b); if(flag) swap(a,b); else printf("no swap\n"); printf("=====================\n"); printf("after swap: a=%d,b=%d\n",a,b); return 0; }
结果:
will@will-laptop:~/ex/10$ ./a.out before swap:a=3,b=5 ===================== after swap: a=5,b=3
相关文章推荐
- 【Xcode学C-6】宏定义#define、条件编译#if、文件包含、内部外部函数以及typedef的用法
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
- 【原创】头文件、宏定义、条件编译、避免头文件重复包含
- 【原创】头文件、宏定义、条件编译、避免头文件重复包含
- 预处理文件,包含预订头文件<>和””有什么区别?
- easy UI使用include<>包含页面时以及加载js文件所注意的事项。
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
- 关于使用#pragma once与#ifndef ___FILE_NAME__H避免文件被多次包含的区别
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令
- include 嵌套 重复 文件包含使用条件编译处理
- solr学习之路 配置文件的讲解以及页面客户端的使用 <二>
- 6.C++ 宏定义、文件包含、条件编译、内部函数和外部函数
- C/C++编译预处理:宏定义指令、文件包含指令、条件编译指令和特殊符号处理
- 头文件包含在<>和“”之间的区别
- 15-预处理指令1-宏定义、条件编译、文件包含
- 黑马程序员--IOS学习笔记总结 预处理指令(宏定义、条件编译、文件包含)
- C 预处理(宏定义,文件包含,条件编译)
- 使用#include<bits/stdc++.h>包含C++的所有头文件
- C语言,多个文件编程,使用不同.c文件的变量声明方法以及头文件的包含
- c语言学习--宏定义、条件编译、文件包含(就是include)