程序的编译

程序的编译分为四个阶段:

预处理:gcc -o test.i -E test.c  展开头文件/宏替换/不进行语法检查。

编译:gcc -o test.s -S test.i 进行语法检查

汇编:gcc -o test.o -c test.s 生成目标文件

连接: gcc -o test test.o 生成可执行文件

预处理详解:

预定义符号

__FILE__    //进行编译的源文件
__LINE__    //文件当前的行号
__DATE__    //文件被编译的日期
__TIME__    //文件被编译的时间
__STDC__    //如果编译器遵循ANSI C,其值为1,否则未定义

例:

#include<stdio.h>
int main()
{
	printf("file:%s line:%d\n", __FILE__, __LINE__);
	return 0;
}

 #define 定义标识符

//语法
#define name stuff

如果定义的stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。

#define DEBUG_PRINT printf("file:%s\tline:%d\t\
                            date:%s\ttime:%s\n",\
                            __FILE__,__LINE__,\
                            __DATE__,__TIME__)

在define定义标识符的时候,建议不要加上‘;’,这样容易导致问题。例如:

#define MAX 1000;

if(condition)
    max=MAX;
else
    max=0;

condition为真时,max=1000;;  有两个分号,else无法与if对齐,出现语法错误

用于对表达式进行求值的宏定义都应该在表达式两边加上一堆括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。

例:

#define ADD(num) num+num

printf("%d\n", ADD(2) * ADD(3));

最后输出为11。原因是2+2*3+3=11

应改为:

#define ADD(num) ((num)+(num))

#define 替换规则

在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

1、在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。

2、替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被它们的值替换。

3、最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。

注意:

1、宏参数和#define定义中可以出现其他#define定义的变量。但是对于宏,不能出现递归。

2、当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

---------------------------------------------------------------------------------------------------------------------------------

使用#,可以把一个宏参数变成对应的字符串

#include<stdio.h>
#define PRINT(FORMAT,VALUE)\
		printf("the value of "#VALUE" is "FORMAT"\n",VALUE);
int main()
{
	int i = 2;
	PRINT("%d", i + 3);
	return 0;
}

##可以把位于它两边的符号合成一个符号。它允许宏定义从分离的文本片段创建标识符。

#include<stdio.h>
#define ADD_TO_SUM(num,value) sum##num+=value;
int main()
{
	int sum3 = 0;
	ADD_TO_SUM(3, 15);	//作用是给sum3加上15
	printf("sum3 = %d\n", sum3);
	return 0;
}

 

 #  取宏参数的值

## 连接

---------------------------------------------------------------------------------------------------------------------------------

宏和函数的对比

#define定义宏函数

代码

长度

每次使用时,宏代码都会被插入到程序中。除了非常小的宏之外,程序的长度会大幅度增长

函数代码只出现于一个地方;每次使用这个函数时,都调用那个地方的同一份代码
执行速度更快存在函数的调用和返回的额外开销,所以相对慢一些
操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否则邻近操作符的优先级可能会产生不可预料的后果,所以建议宏在书写的时候多些括号。。函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。
带有副作用的参数参数可能被替换到宏体中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果。函数参数只在传参的时候求值一次,结果更容易控制。
参数类型宏的参数与类型无关,只要对参数的操作是合法的,它就可以使用于任何参数类型。函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数,即使它们执行的任务是不同的。
调试宏是不方便调试的函数是可以逐语句调试的
递归宏是不能递归的函数是可以递归的

命名约定

一般来讲函数与宏的使用语法很相似。所以语言本身没法帮我们区分二者。那我们平时的一个习惯是:

把宏名全部大写,函数名不要全部大写。

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值