C08_C语言-宏、条件编译、文件包含

1.

    1)不带参数的宏

/*
 * 代码编译为0和1之前执行的语句叫预处理语句。
 * 预处理指令以#定义
 * 第一种:文件包含,#include
 * 第二种:宏定义,#define。#define A B,表示把后文中全部的A换成B
 * 宏的生命:无论定义于何处,从定义的一行开始,直到文件结尾,除非遇到#undef。
 * 		1.不带参宏。
 * 		2.带参的宏。
 * 		结束宏,#undef
 * 			因为是预处理,执行在编译阶段。所以一旦undef,这个宏就注销了,程序在执行阶段很可能访问不到
 * 第三种:条件编译,
 */

//一:文件包含
#include <stdio.h>

//二:1.不带参数的宏定义。定义在方法外面,从这里生命开始
//程序自上而下的编译过程汇总,后面代码中全部的count都替换为6,但不包括字符串
#define NUMBER 6	//不能以;结尾。宏名一般用大写

void main() {
	int ages[NUMBER] = {3,4,5,6,7,1};
	int i;
	for(i = 0; i<NUMBER; i++){
		printf("%d\t", ages[i]);
	}
	printf("\n");

	#define INT 4376//定义在函数内部,生命从这一行开始
	void test();	//声明函数
	//尽管紧随宏定义之后的函数里调用了INT,但真正调用发生在程序运行阶段,
	//编译阶段,仅仅是把INT替换为4376
	test();

	//#undef INT	//如果在这里注销,就是真的结束宏的生命周期。
					//在程序的编译阶段,直到宏结束生命,没有发生替换,毫无意义
	printf("%d\n", INT);	//如果上一句代码有效,这里将发生错误
	//#undef NUMBER
	printf("%d\n", NUMBER);	//同上
}
void test(){
	printf("%d\n", NUMBER);
	printf("%d\n", INT);
}
#undef INT	//在这里结束宏INT的生命是正确的,因为后续的代码再也用不到INT了

    2)带参数的宏

#include <stdio.h>

//定义宏  宏名(参数,参数,...)  替换值(或计算式,不是计算式的结果!)
#define SUM(v1, v2) v1 + v2		//求和宏
//#define SUM(v1, v2) (v1 + v2)	//和上面的定义完全是两回事

#define PRODUCT(v1, v2) (v1 * v2)	//求积宏
//#define PRODUCT(v1, v2) ((v1) * (v2))

void main() {
	int a = 8, b = 7;
	//使用宏,传入参数,返回替换值
	int sum = SUM(a, b);	//!!*发生在编译阶段*!!
	//编译后:int sum = a + b = 8 + 7;
	printf("%d\n", sum);	//15

	sum = SUM(2, 3) * SUM(3, 4);
	//编译后:sum = 2 + 3 * 3 + 4; ,不是sum=5 * 7; !!!
	//定义时加括号,编译后:sum = (2 + 3) * (3 + 4); //运行得35
	printf("%d\n", sum);	//15

	int product = PRODUCT(1+2, 3+4);
	//#define PRODUCT(v1, v2) (v1 * v2)
	// product = (1+2 * 3+4);	//因为宏就是(仅仅是)替换文本!
	// product = (1+ 6 +4);		//执行阶段发生
	// product = 11;
	printf("%d\n", product);	//11
}


2.条件编译

#define NUMBER 8888	//编译时期的量
#define MAX 5555

void main() {
	int i = 7777;	//运行时期的量

	//满足条件才替换文本
	//#if(i == 8888)	//编译时期访问运行时期的量无意义
	//#if(NUMBER == i)	//编译时期访问运行时期的量无意义
	#if(NUMBER == 8888)	//满足编译条件,代码块会保留给运行阶段使用
		if(i == 7777){
			printf("7777\n");
		}
		printf("8888\n");
	#elif(NUMBER == 9999)	//如果不满足条件,代码块就被删除
		printf("9999\n");
	#else
		printf("0000\n");
	#endif	//必须有

	#ifdef MAX	//如果定义了MAX这个宏。
	//#if defined(MAX)	//等同于上一行
		printf("MAX=%d", MAX);
	#endif

	#ifndef MIN		//如果没有定义MIN这个宏
	//#if !defined(MIN)	//等同于上一行
		#define MIN 2222
	#endif
}


3.文件包含



    1)自定义头文件

/*
首先判断是否包含了该头文件,避免重复include
如果没有定义,就解开;如果已经定义,则忽略
*/
#ifndef _MYH_H_			//------------如果没有定义这个宏,就解开
	//首先定义这个没有的宏
	#define _MYH_H_
	/*
	定义头文件,使用一个宏作为钥匙而已
	关键是解开自定义的函数
	*/
	
	#include <stdio.h>		//导入系统头文件。它一定也#ifndef避免重复导入了
	
	void funcMY1();			//声明自定义函数
	void funcMY2(int, int);
	int funcMY3(int, int);
	char *funcMY4();
	
	void funcMY1(){			//实现自定义函数
		printf("自定义头文件中的自定义函数\n");
	}
	void funcMY2(int i, int j){
		printf("传入的形参%d, %d\n", i, j);
	}
	int funcMY3(int i, int j){
		return i + j;
	}
	char *funcMY4(){
		return "欢迎使用自定义头文件";
	}
#endif					//------------解开完毕

    2main主函数文件

/*
 * include
 * <>系统文件,""自定义文件
 * 不允许循环包含。如A文件includeB,同时B文件includeA
 * 不建议重复include同一个文件。可:
 * 		#ifndef A
 * 			#define A
 * 		#endif
 */
#include <stdio.h>
#include "myh.h"	//引入自定义头文件

void main() {
	funcMY1();							//自定义头文件中的自定义函数
	funcMY2(222, 333);					//传入的形参222, 333
	printf("%d\n", funcMY3(555, 666));	//1221
	printf("%s\n", funcMY4());			//欢迎使用自定义头文件
}


- end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于BS模式的SHA-256算法文件完整性程序的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) #define ROTR(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) #define SHR(x, n) ((x) >> (n)) #define CH(x, y, z) (((x) & (y)) ^ (~(x) & (z))) #define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) #define EP0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) #define EP1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) #define SIG0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) #define SIG1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) static const uint32_t K[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 }; static void sha256_transform(uint32_t state[8], const uint8_t data[64]) { uint32_t a, b, c, d, e, f, g, h, i, j, t1, t2, m[64]; for (i=0, j=0; i<16; ++i, j+=4) m[i] = (data[j] << 24) | (data[j+1] << 16) | (data[j+2] << 8) | (data[j+3]); for (; i<64; ++i) m[i] = SIG1(m[i-2]) + m[i-7] + SIG0(m[i-15]) + m[i-16]; a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; f = state[5]; g = state[6]; h = state[7]; for (i=0; i<64; ++i) { t1 = h + EP1(e) + CH(e, f, g) + K[i] + m[i]; t2 = EP0(a) + MAJ(a, b, c); h = g; g = f; f = e; e = d + t1; d = c; c = b; b = a; a = t1 + t2; } state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; state[5] += f; state[6] += g; state[7] += h; } void sha256(const uint8_t *msg, size_t len, uint8_t hash[32]) { uint32_t state[8] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 }; uint8_t data[64]; size_t i, j; for (i=0; i<len; ++i) { if ((i & 63) == 0 && i > 0) sha256_transform(state, data); j = i & 63; data[j] = msg[i]; } j = i & 63; data[j++] = 0x80; if (j > 56) { memset(data+j, 0, 64-j); sha256_transform(state, data); j = 0; } memset(data+j, 0, 56-j); uint64_t bitlen = (uint64_t)len * 8; data[56] = (bitlen >> 56) & 0xff; data[57] = (bitlen >> 48) & 0xff; data[58] = (bitlen >> 40) & 0xff; data[59] = (bitlen >> 32) & 0xff; data[60] = (bitlen >> 24) & 0xff; data[61] = (bitlen >> 16) & 0xff; data[62] = (bitlen >> 8) & 0xff; data[63] = bitlen & 0xff; sha256_transform(state, data); for (i=0; i<8; ++i) { hash[i*4] = (state[i] >> 24) & 0xff; hash[i*4+1] = (state[i] >> 16) & 0xff; hash[i*4+2] = (state[i] >> 8) & 0xff; hash[i*4+3] = state[i] & 0xff; } } int main(int argc, char **argv) { if (argc < 2) { printf("Usage: %s <filename>\n", argv[0]); return 1; } FILE *fp = fopen(argv[1], "rb"); if (!fp) { printf("Unable to open file: %s\n", argv[1]); return 1; } fseek(fp, 0L, SEEK_END); size_t size = ftell(fp); rewind(fp); uint8_t *buf = (uint8_t*)malloc(size); if (!buf) { printf("Unable to allocate memory\n"); fclose(fp); return 1; } if (fread(buf, 1, size, fp) != size) { printf("Unable to read file: %s\n", argv[1]); fclose(fp); free(buf); return 1; } uint8_t hash[32]; sha256(buf, size, hash); printf("SHA-256 hash of %s:\n", argv[1]); for (int i=0; i<32; ++i) printf("%02x", hash[i]); printf("\n"); free(buf); fclose(fp); return 0; } ``` 该程序使用了BS模式,对文件进行SHA-256算法计算,并输出计算结果。用户可以在命令行中指定要计算哈希值的文件,程序会打开文件并读取其中的内容,然后对内容进行哈希计算。计算结果以16进制形式输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值