#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++,但是在查看代码以说明发生了什么时却很难。如何最有效地学习语法和规则?

最佳答案

通过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(具有双重##,例如(0x##y)宏的OPCODE)的信息。

关于c++ - 有人可以解释这小段C++代码,但我无法说清楚,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19217939/

10-11 02:22