有人可以解释这段短小的C ++代码,我无法做出正面或反面

时间:2013-10-07 05:57:02

标签: c++ function pointers syntax

#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

的链接

我知道这只是一个奇怪的格式化函数,但是,我想知道函数名开头的*究竟是什么意思。我认为它与指针有关?

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

我想更加认真地对待C ++,但是在查看代码以确定究竟发生了什么时却非常困难。如何最有效地学习语法和规则?

2 个答案:

答案 0 :(得分:4)

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

#define不是声明,而是preprocessor directive

OPCODES扩展到一些大块,特别是包含OPCODE( NOP, 61),它将扩展为类似

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

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

GCC在其cpp preprocessor上有很好的文档。阅读stringification(单#,如#x;宏的结尾OPCODE)和concatenation(有##的{​​{1}} (0x##y)宏的OPCODE

答案 1 :(得分:2)

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

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

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

  • 0x01 - &gt; OP_CODE1
  • 0x02 - &gt; OP_CODE2
  • 0x03 - &gt; 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的写作houndreds ......程序员决定创建宏

#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 processor)是:

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

所以你的桌子可能是:

#define OPCODES \
OPCODE( 40, "INCEAX" ) \
OPCODE( 60, "PUSHA" ) \
OPCODE( 90, "NOP" )