inline;strlen&sizeof

本文深入解析C++中内联函数的作用及其与宏定义的区别,并对比strlen与sizeof的功能特性与应用场景。

inline:

C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。inline是一种"用于实现的关键字",而不是一种"用于声明的关键字"。一般的,用户可以阅读函数的声明,但是看不到函数的定义。

C&C++inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义

表达式形式的宏定义一例:

#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

 C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。

Strlen&sizeof:

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')

sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组)或常量时,它不需要用圆括号。它在编译时起作用,而不是运行时。

二者区别

⒈sizeof操作符的结果类型是size_t,它在头文件中typedefunsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

⒉sizeof是取字节运算符(关键字)strlen是函数。

⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:

short f();

printf("%d\n",sizeof(f()));

输出的结果是sizeof(short),即2

数组做sizeof的参数不退化,传递给strlen就退化为指针了。

大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因

char str[20]="0123456789";

long a=strlen(str); //a=10;

int b=sizeof(str); //b=20;

6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

int tpsocket_aes_cbc_encrypt(const unsigned char *in, unsigned char *out, unsigned int len, const struct tpsocket_aes_key *key, unsigned char *iv, int forward) { unsigned char tmp[16]; int i; if (forward) { while (len >= sizeof(tmp)) { for (i = 0; i < sizeof(tmp); i++) tmp[i] = in[i] ^ iv[i]; tpsocket_aes_encrypt(tmp, out, key); memcpy(iv, out, sizeof(tmp)); len -= sizeof(tmp); in += sizeof(tmp); out += sizeof(tmp); } if (len) { for (i = 0; i < len; i++)tmp[i] = in[i] ^ iv[i]; for (i = len; i < sizeof(tmp); i++) tmp[i] = iv[i]; tpsocket_aes_encrypt(tmp, out, key); memcpy(iv, out, sizeof(tmp)); } } else { while (len >= sizeof(tmp)) { memcpy(tmp, in, sizeof(tmp)); tpsocket_aes_decrypt(tmp, out, key); for (i = 0; i < sizeof(tmp); i++) out[i] ^= iv[i]; memcpy(iv, tmp, sizeof(tmp)); len -= sizeof(tmp); in += sizeof(tmp); out += sizeof(tmp); } if (len) { memcpy(tmp, in, sizeof(tmp)); tpsocket_aes_decrypt(tmp, out, key); for (i = 0; i < len; i++) out[i] ^= iv[i]; memcpy(iv, tmp, sizeof(tmp)); } } return 0; }static inline void work_tapo_aec_decrypt(unsigned char *inputbuf, int inputlen, unsigned char *outbuf, int *outputlen) { unsigned char tmpiv[16]; memcpy(tmpiv, tapo_iv, sizeof(tapo_iv)); if (tpsocket_aes_cbc_encrypt(inputbuf, outbuf, inputlen, &tapo_aes_dec_key, tmpiv, 0) == 0) *outputlen = inputlen; else *outputlen = 0; }static inline void work_tapo_refresh_encrypt_key(void) { md5_ctx_t md5_ctx; char tmp[64] = {0}; //DBG_DBG("tapo_nonce: %s\n", tapo_nonce); //DBG_DBG("tapo_passwd: %s\n", tapo_passwd); md5_begin(&md5_ctx); md5_hash(tapo_nonce, strlen(tapo_nonce), &md5_ctx); md5_hash(":", strlen(":"), &md5_ctx); md5_hash(tapo_passwd, strlen(tapo_passwd), &md5_ctx); md5_end(tapo_key, &md5_ctx); md5_begin(&md5_ctx); md5_hash(tapo_user, strlen(tapo_user), &md5_ctx); md5_hash(":", strlen(":"), &md5_ctx); md5_hash(tapo_nonce, strlen(tapo_nonce), &md5_ctx); md5_end(tapo_iv, &md5_ctx); tpsocket_hex_encode(tapo_key, sizeof(tapo_key), (unsigned char *)tmp, 0); //DBG_DBG("tapo_key: %s\n", tmp); tpsocket_hex_encode(tapo_iv, sizeof(tapo_iv), (unsigned char *)tmp, 0); //DBG_DBG("tapo_iv: %s\n", tmp); tpsocket_aes_set_encrypt_key((unsigned char *)tapo_key, 128, &tapo_aes_key); tpsocket_aes_set_decrypt_key((unsigned char *)tapo_key, 128, &tapo_aes_dec_key); #ifdef HTTP_HMAC_HKDF_SUPPORT #define HKDF_SHA256_INFO_AES_KEY “stream_hkdf_aes_key” #define HKDF_SHA256_INFO_HMAC_KEY “stream_hkdf_hmac_key” int iRet = 0; for (int i = 0; i < 32; i++) { iRet = rand() % 16; tapo_salt[i] = iRet < 10 ? ('0' + iRet) : ('a' + iRet - 10); } char hkdf_ikm_key[512] = {0}; memset(hkdf_ikm_key, 0, 512); snprintf(hkdf_ikm_key, sizeof(hkdf_ikm_key), "%s:%s", tapo_nonce, tapo_passwd); tpsocket_sha256_hkdf((unsigned char *)tapo_salt, strlen(tapo_salt), (unsigned char *)hkdf_ikm_key, strlen(hkdf_ikm_key), (unsigned char *)HKDF_SHA256_INFO_AES_KEY, strlen(HKDF_SHA256_INFO_AES_KEY), tapo_key_hkdf, sizeof(tapo_key_hkdf)); tpsocket_sha256_hkdf((unsigned char *)tapo_salt, strlen(tapo_salt), (unsigned char *)hkdf_ikm_key, strlen(hkdf_ikm_key), (unsigned char *)HKDF_SHA256_INFO_HMAC_KEY, strlen(HKDF_SHA256_INFO_HMAC_KEY), tapo_key_hkdf_hmac, sizeof(tapo_key_hkdf_hmac)); tpsocket_aes_set_encrypt_key((unsigned char *)tapo_key_hkdf, 128, &tapo_aes_key_hkdf); tpsocket_aes_set_decrypt_key((unsigned char *)tapo_key_hkdf, 128, &tapo_aes_dec_key_hkdf); #endif }void work_tapo_refresh_nonce() { tpsocket_hex_random((unsigned char *)tapo_nonce, 32, 0); work_tapo_refresh_encrypt_key(); set_media_encrypt_status(MEDIA_ENCRYPT_VALID); }这段代码中,如果为加密的情况,把nbuf先进行HEX解码,再进行后续操作。
10-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值