You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:27:26