#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 ++,但是在查看代码以确定究竟发生了什么时却非常困难。如何最有效地学习语法和规则?
答案 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'
)的字节,以指示字符串的结尾!
此函数将操作码(汇编指令)转换为可读字符串。所以程序员的意图是转变:
代码的扩展版本是这样的:
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" )