Tôi đang viết bộ mô phỏng vi xử lý trong C++ và một trong những mục tiêu của tôi là làm cho mã trở nên dễ đọc. Để thực hiện opcodes, tôi có một cấu trúc mà tôi đang sử dụng để đại diện cho các hướng dẫn bộ xử lý riêng lẻ, và nó chứa cả mã opcode và cách xa bộ đếm chương trình. Ý tưởng là để nhóm thông tin liên quan về mỗi hướng dẫn.C++: cấu trúc thành viên trong câu lệnh switch
struct instruction
{
const int opcode; // instruction opcode
const int op_size; // how far to advance Program Counter
};
const instruction HALT{0x76, 1};
const instruction NOP {0x00, 1};
kế hoạch ban đầu của tôi là để xác định tất cả các opcodes sử dụng struct này, như tôi đã theo ấn tượng rằng const
được ưa thích để sử dụng #define
cho C++ hằng số. Ngoài ra, tôi sẽ có thể nhóm sạch tất cả các thuộc tính liên quan của một opcode.
Tuy nhiên, có vẻ như điều này sẽ không hoạt động đối với báo cáo chuyển đổi, như tôi dự định ban đầu. Đoạn mã sau sẽ không biên dịch, và Visual Studio cung cấp lỗi "biểu thức trường hợp không liên tục".
switch (next_instruction) { // next_instruction is an int parsed from a file
case HALT.opcode:
// do stuff
break;
case NOP.opcode:
// do stuff
break;
default:
std::cout << "Unrecognized opcode" << std::endl;
break;
}
Tôi cũng đã tải về mới nhất Visual Studio biên dịch (MSVC Tháng 11 2013 CTP) để cố gắng tận dụng constexpr
từ C++ 11, nhưng tôi đã có cùng một vấn đề, và nó sẽ không biên dịch. Ở đây tôi chuyển đổi cấu trúc của tôi thành một lớp và cố gắng tận dụng constexpr
, để đảm bảo rằng các thành viên của một instruction
có thể được sử dụng làm hằng số thời gian biên dịch.
class Instruction
{
public:
constexpr Instruction(int code, int size) : opcode(code), op_size(size) {}
const int opcode; // instruction opcode
const int op_size; // how far to advance Program Counter
};
constexpr Instruction HALT(0x76, 1);
constexpr Instruction NOP (0x00, 1);
Tôi không thực sự chắc chắn phải làm gì vào thời điểm này, vì dường như trình biên dịch không hiểu rằng các giá trị struct được gán làm hằng số.
Vậy có cách nào để sử dụng thành viên cấu trúc trong câu lệnh chuyển đổi hay tôi chỉ cần chuyển sang sử dụng #define
? Ngoài ra, có cách nào tốt hơn để làm điều này trong khi vẫn giữ lại một số tổ chức? Tôi thực sự đánh giá cao bất kỳ trợ giúp hoặc thông tin chi tiết nào bạn có thể cung cấp, cảm ơn!
EDIT: Xin lỗi, tôi nên đã làm cho nó rõ ràng hơn rằng next_instruction chỉ là một int, không phải là một instruction
struct/đối tượng
Phiên bản 'constexpr' của bạn sẽ hoạt động. Vì vậy, nó có thể là trình biên dịch của bạn không thực hiện điều này một cách chính xác. Tuy nhiên, bạn nên hiển thị định nghĩa 'next_instruction'. – juanchopanza
'constexpr' chỉ được triển khai trong Visual Studio Next (14), Visual Studio 2013 không triển khai nó. Ngoài ra, phiên bản phát hành mới nhất của VS là bản cập nhật 2013 3 chứ không phải là CTP tháng 11. – Drop
Ngoài ra, mã của bạn có mùi "Type Switch antipattern". Bạn có thể có thể sử dụng đa hình ở đây (động hoặc tĩnh) thay vì điều kiện: [Cách để loại bỏ chuyển đổi trong mã] (http://stackoverflow.com/questions/126409/ways-to-eliminate-switch-in-code). Hầu hết thời gian nó có thể nhanh hơn (bạn sẽ cần phải cấu hình nó). – Drop