1
#include <opcodes.h>
const char *getOpcodeName(
    uint8_t op
)
{
    #define OPCODE(x, y) if((0x##y)==op) return "OP_" #x;
        OPCODES
    #undef OPCODE
    return "OP_UNKNOWN";
}

链接到这里的代码:https ://github.com/znort987/blockparser/blob/master/opcodes.cpp

这是包含的opcodes.h的链接

我知道这只是一个格式奇怪的函数,但是,我想知道*函数名称开头的确切含义。我认为它与指针有关?

此外,#undefand#define语句如何有效?任何一个后面都没有分号,其中一个似乎被定义为单行函数。是什么(0x##y)意思?是什么return "OP_" #x意思?我以前从未遇到过这样的语法。

我想更认真地进入 C++,但是在查看代码时很难知道到底发生了什么。如何最有效地学习语法和规则?

4

2 回答 2

4

通过C++ 预处理器运行您的代码,例如使用g++ -Wall -C -E opcodes.cpp > opcodes.i然后查看生成的内部opcodes.i

#define不是语句,而是预处理器指令

OPCODES被扩展为一些大块,特别是包含OPCODE( NOP, 61)将扩展为类似的东西

if ((0x61)==op) return "OP_" "NOP";

在这里,两个字符串文字连接为一个"OP_NOP"

GCC 在其cpp 预处理器上有一个很好的文档。阅读有关字符串化(使用单像宏的#结尾)和连接(使用双像宏)的信息。#x;OPCODE##(0x##y)OPCODE

于 2013-10-07T05:59:07.580 回答
2

简短回答:此函数将操作码转换为字符串。

*IS RELATED 与指针有关!事实上,这个函数返回一个const char *类型。这是用于指向C-String的 char 缓冲区(在本例中)的指针。每个 C 字符串实际上是一个带有“可读字符”(字母数字、一些重音符号、基本符号 + 一些东西)的缓冲区,后面跟着一个值 0(或'\0')的字节来指示字符串的结尾!

此函数将操作码(汇编指令)转换为可读字符串。所以程序员的意图是改造:

  • 0x01 -> OP_CODE1
  • 0x02 -> OP_CODE2
  • 0x03 -> OP_CODE3

代码的扩展版本是这样的:

const char *getOpcodeName( uint8_t op )
{
    if((0x01)==op) return "OP_X";
    if((0x02)==op) return "OP_Y";
    if((0x03)==op) return "OP_Z";
    ...
    if((0x??)==op) return "OP_?";
    return "OP_UNKNOWN";
}

编写了数百个 IF ......程序员决定创建宏

#define OPCODE(x, y) if((0x##y)==op) return "OP_" #x;

因此可以像这样轻松编写 OPCODES 表:

#define OPCODES \
OPCODE( 01, "X" ) \
OPCODE( 02, "Y" ) \
OPCODE( 03, "Z" ) \
...
OPCODE( ??, "?" )

操作码是识别处理器指令(汇编指令)的代码。真实指令的示例(对于某些Intel 处理器)是:

  inc eax      ; opcode = 0x40
  pusha        ; opcode = 0x60
  nop          ; opcode = 0x90

所以你的桌子可能是:

#define OPCODES \
OPCODE( 40, "INCEAX" ) \
OPCODE( 60, "PUSHA" ) \
OPCODE( 90, "NOP" )
于 2013-10-07T06:29:48.033 回答