励志做一个文艺程序员的我,发现自己还是缺少文艺细胞,所以博客名字非常直白,就是来说一说基本标示符合宏以及编译连接的过程。

首先是基本标示符,这就简单来谈四个:__FILE__,__LINE__,__DATE__,__TIME__.

第一个:__FILE__:顾名思义就是文件的存储位置,这个在打印语句中是用%s来输出的;

第二个:__LINE__:这个就是此时你的打印语句在这个C程序的第几行,用%d显示;

第三个:__DATE__:这个是显示当前的日期,包括年份、月份和日期,因为是英文的缘故,是按年,日,月来输出的;

第四个:__TIME__:这个用来显示当前的时间。

以下是代码实现

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int main()
{printf("%s\n %d\n %s\n %s\n",__FILE__,__LINE__,__DATE__,__TIME__);system("pause");return 0;
}

这个就十分简单了,就不多说了。

现在说宏,宏有很多作用,但大家平时用得最多的就是定义一个全部变量。例如:

#define M 10  //这个就是这个C文件中想用10时,采用M就行,加深了代码的灵活性

除了这个,宏还有很多的作用,并且宏是在预处理阶段进行的,即编译阶段就会将宏的作用体现,这个在VS里面没法看,在linux里面会发现gcc编译之后就会发现.i文件中已经实现了宏。

要注意的是,在宏里定义时,要养成一个加小括号的习惯,例如

#define ADD(a,b)  a * b

假如是3*5的话,会正确是输出15,但是如果a为1+2,b是4+1时,这个时候的逻辑就是1+2 * 4+1 ,这个时候的优先级是先乘法再加法,结果就是10,而不是需要的15,但如果加括号的话就是(1+2)*(4+1),出来的就是15了,同理,为了防止其他的问题,也应该给整个式子加上括号((1+2)*(4+1))。

宏在定义函数时,要进行do{函数1,函数2,...,函数n;}while(0)的操作,为的是防止函数后面的分号,和main函数里面的分号产生冲突。例如:

#define name do{函数1,函数2,...,函数n;}while(0)
int main ()
{name;return 0;
}

这时就不用在意分号了(只要你输入无误)。

同样,宏里面还能定义字符串。例如“

#define str “Hello”
int mian ()
{printf("str"world " \n");return 0;
}

此时,因为宏定义的邻近字符串的连接特性,可以直接采用str,而不用给str带上双引号。

宏定义里面还可以将两个连接成一个,说起来可能不是很好表达,大家看一下代码

#define M  "Hello "
#define N  "World "
#define MN "Hello World "
#define LINK(x,y)  x##y
int main()
{
    printf("%s",LINK(M, N));//此时输出就会是完整的"Hello World "
    return 0;
}

宏的定义还有很重要的一点,那就是条件编译,这个在我们写代码,项目的时候对我们非常有帮助,一方面可以防止头文件被重复调用,另一方面可以让我们将宏用的更加灵活,对宏的定义也更深刻,下面的也只是我的一点理解,有不足的地方还请告知。

例如:#define后一个名称,用到一半,在下面的文件中发现还有别的函数或者变量更适合这个名字,此时你可以用#undef来移除这个宏定义,那么之前你定义的那个宏定义就会失去作用,但在#undef之前还可以使用。但是这个不建议使用,假如你这样使用,或许别人有时会忽略或者没看到中间的#undef,那么会一直以为你的宏定义是之前的意思,容易造成误解,  不过要是只有你自己看的话那就随便咯。

还可以用来检测是否被定义

#if  !define(symbel)   //检测symbel是否被定义,没有定义的话执行下面的语句
#define  symbel    //没有定义,测定义symbel

另一个作用:

//1
#define NAME ...  //定义NAME
#if  NAME  语句1   //若NAME为真,则输出语句1
#endif
//2
<pre name="code" class="html">#define NAME ...  //定义NAME
#if  NAME  语句1   //若NAME为真,则输出语句1
#elif NAME1  语句2   //若NAME1为真,则输出语句1
#elif NAME2   语句3    //若NAME2为真,则输出语句1
...
#endif

编译连接:

说实话。我对这个也不是很了解,而仅有的这些还是在Linux上了解的,首先建立好一个简单的C文件之后,编译这个文件,这时会进行预处理,而预处理会进行四项活动分别是:头文件展开、去注释、宏替换、条件编译。这些在linux上你将.c文件转为.i文件后可以看见采用gcc -E test.c -o test.i语句,再使用cat test.i可以进入.i文件进行查看,假如你还觉得不是很贴近计算机的方式还可以用gcc -S test.i -o tets.s,再用cat test.s进行查看汇编语言,要是你还觉得不过瘾,那就gcc -c test.s -o test.o,再用cat查看8进制或者16进制的01序列吧。

而且,本地中有很多头文件还有库函数,在编译期间并没有将这些东西编译进去,那么会在什么时候起作用呢?会在链接时,将你自己的C文件编译完成没有错误之后,和这写库函数进行统一的链接,形成一个完整的可执行文件,把可执行程序需要的所有编译过程产生的.o或者obj文件组合到一起(包括.lib),另外连接过程还会组合一些其他数据,比如次元,可执行文件头等。

基本标示符-宏-编译连接相关推荐

  1. 【C++】46.宏定义##连接符和符#的使用

    推荐下面两篇博客: 1.C/C++语言宏定义##连接符和符#的使用 2.c++/c中的##连接符的使用 在c/c++语言中,我们可以使用##来对一些字符进行连接,方便使用,尤其是在宏定义中使用该符号, ...

  2. C/C++语言宏定义##连接符和符#的使用

    C/C++语言宏定义##连接符和符#的使用     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/53113187 (一) ...

  3. 连接远程服务器提示ora 12154,EasyConnect出现ORA-12154(无法解析指定的连接标示符)错误的解决...

    今天在群里碰见了一个ORA-12154的问题,在此记录一下解决过程 起因是群里面一个人问了他的Windows客户端采用easy connect方式连接Oracle服务器的时候,报错如下: ORA-12 ...

  4. c语言宏编译命令大全,C语言宏定义与预编译详解

    http://blog.csdn.net/findaway123/article/details/6994203 2011 1.宏定义和函数的区别 -------------------------- ...

  5. python合法的字符串_Python判断字符串是否为合法标示符操作

    这学期在学习编译原理,最近的上机作业就是做一个简单的词法分析器,在做的过程中,突然有个需求就是判断一个字符串是否为合法的标示符,因为我是用python语言做的,做的是Python的词法分析器,于是下面 ...

  6. java的标示符规则与名称命名规范

    1.在讲java标示符的规则之前我给大家介绍下什么是标示符 标示符: ->java对各种变量.方法和类等要素命名时使用的字符序列称为标示符. ->凡是自己可以起名字的地方都叫标示符. 定义 ...

  7. [转载]Matlab绘图-很详细,很全面(包含各种标示符的输入方法)

    原文地址:Matlab绘图-很详细,很全面(包含各种标示符的输入方法)作者:deman Matlab绘图-很详细,很全面 Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一 ...

  8. Python标示符和关键字

    标示符 什么是标示符,看下图: 标识符就是开发人员在程序中自定义的一些符号和名称. 标示符是自己定义的,如变量名 .函数名等. 标示符的规则 标示符由字母.下划线和数字组成,且数字不能开头 pytho ...

  9. eplan部件列表手动修改_EPLAN如何修改设备标示符规则,当插入元件时不显示设备标示符前的“-”号,每次删除很麻烦!...

    点击查看EPLAN如何修改设备标示符规则,当插入元件时不显示设备标示符前的"-"号,每次删除很麻烦!具体信息 答:点击"选项"-"设置"-& ...

  10. Keil中使用宏编译来定义DEBUG输出

    使用宏编译来格式化调试信息,是一个不错的方法,即可以在需要的时候打印出信息,还可以格式化我们所需要的输出. #define DEBUG 1 #if (DEBUG == 1) #define DBG(A ...

最新文章

  1. 大学计算机数学基础2,大学计算机基础(第2版)
  2. 29、C++ Primer 4th 笔记,异常处理
  3. Spring MVC page render时jsp中元素相对路径的解决办法
  4. java内部类的定义_java定义内部类
  5. linux关闭cups命令,使用linux的cupsenable命令启动指定的打印机
  6. BUFF 在C++ 中取其中一部分 并且写到固定的目录下
  7. 苹果向开发者发布iOS/iPadOS 14.6的第二个测试版
  8. CF633C:Spy Syndrome 2——题解
  9. JavaScript 基础(超详细)
  10. 实例讲解EasyLanguage入门
  11. 大学生活这样过,校招 offer 飞来找
  12. 魔方机器人-复原步骤(一)
  13. 二硬脂酰磷脂酰乙醇胺-聚乙二醇-巯基吡啶 DSPE-PEG-OPSS;常用于脂质体的合成
  14. jmeter性能测试1-录制脚本
  15. 超平面,半空间,多面体,单纯形定义与解析
  16. 数据结构——电话本-顺序表
  17. 物业管理源码 物业源码app
  18. 通讯数据指示灯的C语言程序6,这些关于PLC的经典问答,你必须知道
  19. MyEclipse导入主题文件epf后xml及jsp等页面中点击标签之后显示灰白
  20. 关于Method does not override method from its superclass

热门文章

  1. 我要偷偷的学Python,然后惊呆所有人(最后一天)
  2. 在Intellij IDEA中使用Debug
  3. Excel基础篇(四):查找重复身份证号码
  4. 柳絮飘,往事忆:前言
  5. Towards a Theory of Accountability and Audit
  6. 计算机软件著作权查询网址
  7. c语言字符串的加减乘除,c语言加减乘除代码
  8. python抓取淘宝评论_python3抓取淘宝评论内容
  9. 【023】水仙花数算法
  10. 电动车 碟刹维修 液体的杠杆原理, 帕斯卡定律