C++跨文件访问函数内变量:AES库开发的Nr调用问题
问题描述
本人对密码学感兴趣,正尝试开发AES库,但C++编程已生疏。现有AES.cpp文件中initialize_aes函数内定义了Nr变量,希望在main.cpp中调用该变量。尝试过extern关键字和类的方式但未成功,给出了类实现的尝试代码但存在错误,期望实现可全局调用的类对象,或找到合适的解决办法。
初始代码
AES.cpp
#include "AES.h" #include <iostream> #include <cstdint> void initialize_aes(int Nk){ int Nr; try { if(Nk == 4){ Nr = 10; } else if(Nk == 6){ Nr = 12; } else if(Nk == 8){ Nr = 14; } else { throw (Nk); } } catch (int a){ std::cout << "error: '" << a << "' is not an accepted value for key length"; } };
main.cpp
#include "AES.h" #include <iostream> #include <cstdint> int main(){ uint8_t i[256]; initialize_aes(6); std::cout << Nr; }
尝试的错误类实现代码
AES.cpp
class AES { public: int Nr; int Nk; int Nb = 4; }; void initialize_aes(a, int Nk){ try { if(Nk == 4){ AES a; AES_4.Nr = 10; AES_4.Nk = 4; } else if(Nk == 6){ AES a; AES_6.Nr = 12; AES_6.Nk = 6; } else if(Nk == 8){ AES a; AES_8.Nr = 14; AES_6.Nk = 8; } else { throw (Nk); } } catch (int a){ std::cout << "error: '" << a << "' is not an accepted value for key length"; } };
main.cpp
int main(){ AES aes; initialize_aes(aes, 6); std::cout << aes.Nr; }
解决方案
方法1:修正类实现(推荐)
你的类尝试代码存在语法和逻辑错误:函数参数未声明类型、创建局部对象而非修改传入对象、使用未定义的AES_4等标识符。以下是修正后的规范实现:
1. AES.h(类声明必须放在头文件)
#ifndef AES_H #define AES_H #include <cstdint> class AES { public: int Nr = 0; int Nk = 0; const int Nb = 4; // 固定值设为const更合理 // 将初始化逻辑改为类成员函数 void initialize(int key_length_Nk); }; // 若需要全局可调用对象,添加extern声明 extern AES global_aes; #endif // AES_H
2. AES.cpp(实现类成员函数)
#include "AES.h" #include <iostream> // 定义全局对象(如果需要) AES global_aes; void AES::initialize(int key_length_Nk){ try { if(key_length_Nk == 4){ this->Nr = 10; this->Nk = 4; } else if(key_length_Nk == 6){ this->Nr = 12; this->Nk = 6; } else if(key_length_Nk == 8){ this->Nr = 14; this->Nk = 8; } else { throw key_length_Nk; } } catch (int invalid_Nk){ std::cout << "error: '" << invalid_Nk << "' is not an accepted value for key length"; } };
3. main.cpp(使用方式)
#include "AES.h" #include <iostream> int main(){ uint8_t i[256]; // 方式1:使用局部对象 AES aes; aes.initialize(6); std::cout << aes.Nr << std::endl; // 输出12 // 方式2:使用全局对象 global_aes.initialize(4); std::cout << global_aes.Nr << std::endl; // 输出10 return 0; }
方法2:使用extern全局变量(不推荐,不利于封装)
如果坚持用全局变量,需将Nr声明在全局作用域,而非函数内部:
1. AES.h
extern int Nr;
2. AES.cpp
#include "AES.h" #include <iostream> #include <cstdint> int Nr = 0; // 全局定义变量 void initialize_aes(int Nk){ try { if(Nk == 4){ Nr = 10; } else if(Nk == 6){ Nr = 12; } else if(Nk == 8){ Nr = 14; } else { throw Nk; } } catch (int a){ std::cout << "error: '" << a << "' is not an accepted value for key length"; } };
3. main.cpp
#include "AES.h" #include <iostream> #include <cstdint> int main(){ uint8_t i[256]; initialize_aes(6); std::cout << Nr; // 输出12 return 0; }
方法3:函数返回Nr值(轻量简洁方案)
若仅需获取Nr值,无需全局状态,可让函数直接返回计算结果并处理错误:
1. AES.h
#include <optional> // C++17及以上支持 std::optional<int> get_aes_Nr(int Nk);
2. AES.cpp
#include "AES.h" #include <iostream> std::optional<int> get_aes_Nr(int Nk){ if(Nk == 4){ return 10; } else if(Nk == 6){ return 12; } else if(Nk == 8){ return 14; } else { std::cout << "error: '" << Nk << "' is not an accepted value for key length"; return std::nullopt; } };
3. main.cpp
#include "AES.h" #include <iostream> int main(){ uint8_t i[256]; auto nr = get_aes_Nr(6); if(nr){ std::cout << *nr; // 输出12 } return 0; }
内容的提问来源于stack exchange,提问作者MsFormula
相关产品推荐
相关产品推荐

