const char * a = "SSS" 与 const char a[] = "SSS" 的区别之一

本文探讨了在C/C++编程中使用const修饰符的不同方式及其对编译的影响。通过对比两种不同定义常量的方法,解释了为何一种会导致重复定义错误,而另一种则能正确应用于多个源文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天碰到一个问题, 在.h里定义如题的文件,一开始用第一种方法,总是报错重复定义

 

 

也加了 #ifndef ... , 后来改为第二种就好了

 

 

因为第一种const 修饰的是char * 而不是a, 所以a是变量,

 

 

而第二种a是常量,所以可以被多个cpp文件include

c语言 检查一下下面的代码 为什么函数中获取不到键值#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h> #include <openssl/hmac.h> #include <jansson.h> #include <time.h> #include <errno.h> #include <resolv.h> #include <netdb.h> char* calculate_signature(char* json_str, char* key) { json_t *root; json_error_t error; /* 从文件中读取 JSON 数据 */ root = json_load_file(json_str, 0, &error); /* 遍历 JSON 对象中的所有键值对,并获取键的名称 */ int key_count = json_object_size(root); printf("key_names %d\n", key_count); const char *key_name; json_t *value; const char **key_names = (const char **)malloc(key_count * sizeof(char *)); int i = 0; json_object_foreach(root, key_name, value) { key_name = json_object_iter_key(value); key_names[i] = key_name; i++; } printf("key_names %s\n", key_names[2]); //int str_num = i; // 计算字符串数组中的字符串数量 /* char **sorted_names = sort_strings(key_names, key_count); char* stringA = (char*)malloc(1); // 初始化为一个空字符串 stringA[0] = '\0'; size_t len = 0; for (int i = 0; i < str_num; i++) { char* key = sorted_names[i]; json_t* value = json_object_get(root, key); char* str = json_dumps(value, JSON_ENCODE_ANY | JSON_COMPACT); len += strlen(key) + strlen(str) + 2; // 2 是键值对之间的字符 stringA = (char*)realloc(stringA, len); strcat(stringA, key); strcat(stringA, "="); strcat(stringA, str); strcat(stringA, "&"); free(str); } free(sorted_names); stringA[strlen(stringA) - 1] = '\0'; // 去掉最后一个"&" printf("stringA%s\n", stringA); unsigned char* sign = (unsigned char*)malloc(EVP_MAX_MD_SIZE); unsigned int sign_len = 0; HMAC(EVP_sha256(), key, strlen(key), (unsigned char*)stringA, strlen(stringA), sign, &sign_len); // 计算HMAC-SHA256签名 char* signature = (char*)malloc(sign_len * 2 + 1); // 签名的十六进制表示 signature[0] = '\0'; // 初始化为一个空字符串 for (int i = 0; i < sign_len; i++) { sprintf(signature + i * 2, "%02x", sign[i]); } json_object_set_new(root, "sign", json_string(signature)); // 在json中添加"sign"参数 json_dumpf(root, stdout, JSON_ENCODE_ANY | JSON_COMPACT); // 输出带有"sign"参数的json字符串 json_decref(root); free(key_names); free(stringA); free(sign); printf("signature%s\n", signature); */ return("A"); } int main() { char *key="39cabdfaab8c4da09bd6e9823c527836"; char *sss="{\"timestamp\":1685509898,\"sdkVersion\":\"1.0.30_1\",\"vin\":\"LJUBMSA24PKFFF198\"}"; calculate_signature(sss, key) ; }
06-01
/*********************************************************** *原型:void FileFolderSize(const char *path,int *cap) *功能:获取文件夹的大小,返回文件夹的字节大小 ***********************************************************/ void FileFolderSize(const char *path,int *cap) { int sum = 0; char aaa[300] = {0}; DIR * dir; struct dirent * dir_info; char file_path[PATH_MAX]; if(Is_File(path)) { remove(path); return; } if(Is_Dir(path)) { if((dir = opendir(path)) == NULL) return; while((dir_info = readdir(dir)) != NULL) { Get_File_Path(path, dir_info->d_name, file_path); if(Is_Special_Dir(dir_info->d_name)) { continue; } sprintf(aaa,"%s/%s",path,dir_info->d_name); sum += File_Size(aaa); // PRINT("d_name : %s\n", dir_info->d_name); } closedir(dir); } *cap = sum; } 这段C语言代码是否可以在Ubuntu22.04系统中正确算出文件夹的大小 /*********************************************************** *原型:bool Is_Dir(const char *path) *功能:判断是否为目录 ***********************************************************/ bool Is_Dir(const char *path) { struct stat statbuf; if(lstat(path, &statbuf) ==0)//lstat返回文件的信息,文件信息存放在stat结构中 { return S_ISDIR(statbuf.st_mode) != 0;//S_ISDIR宏,判断文件类型是否为目录 } return false; } /*********************************************************** *原型:bool Is_Special_Dir(const char *path) *功能:判断是否是特殊目录 ***********************************************************/ bool Is_Special_Dir(const char *path) { return strcmp(path, ".") == 0 || strcmp(path, "..") == 0; } /*********************************************************** *原型:bool Is_File(const char *path) *功能:判断是否为常规文件 ***********************************************************/ bool Is_File(const char *path) { struct stat statbuf; if(lstat(path, &statbuf) ==0) return S_ISREG(statbuf.st_mode) != 0;//判断文件是否为常规文件 return false; } /*********************************************************** *原型:void Get_File_Path(const char *path, const char *file_name, char *file_path) *功能:生成完整的文件路径 ***********************************************************/ void Get_File_Path(const char *path, const char *file_name, char *file_path) { strcpy(file_path, path); if(file_path[strlen(path) - 1] != '/') strcat(file_path, "/"); strcat(file_path, file_name); } /*********************************************************** *原型:int File_Size(char* filename) *功能:获取文件的大小,返回文件的字节大小 ***********************************************************/ int File_Size(char* filename) { int size = 0; struct stat sss; stat(filename,&sss); size = sss.st_size; return size; } 请修改以上代码,可以处理特别长的路径名,并可以在Ubuntu20.04系统正常运行
最新发布
05-29
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值