c++ - 不正确的操作数类型 MSVC
问题描述
当前尝试从方法发出随机指令,但不断收到错误“操作数类型不正确”。
#include <iostream>
#include <time.h>
#define PUSH 0x50
#define POP 0x58
#define NOP 0x90
auto generate_instruction() -> int {
int instruction_list[] = { NOP };
return instruction_list[rand() % (sizeof(instruction_list) / sizeof(*instruction_list))];
}
#define JUNK_INSTRUCTION(x) \
__asm _emit PUSH \
__asm _emit x \
__asm _emit POP \
#define JUNK JUNK_INSTRUCTION(generate_instruction)
int main() {
srand(static_cast<int>(time(NULL)));
JUNK;
std::cout << "Hello World!" << std::endl;
}
但是,当我替换#define JUNK JUNK_INSTRUCTION(generate_instruction)
为 时#define JUNK JUNK_INSTRUCTION(NOP)
,程序运行良好。我不确定为什么当它们都返回相同的值时它不起作用。
解决方案
不确定您要做什么。
JUNK
扩展为JUNK_INSTRUCTION(generate_instruction)
,这将扩展为:
__asm _emit PUSH
__asm _emit generate_instruction
__asm _emit POP
generate_instruction
只是一个函数的名称。编译器不会仅仅因为您命名它就运行该函数并替换它。
根据文档,您需要提供一个常量字节值,就像您对其他两个一样。
我认为您真的对运行时调用、编译时计算和宏的概念感到困惑。
推荐阅读
- json - 如何检索嵌套地图数据“json.unmarshal()”作为空接口
- python - 使用 selenium 和 python 抓取网站时 Webdriver chrome 崩溃:未知错误:DevToolsActivePort 文件不存在
- mongodb-query - 可以对多个条目进行分组并为这些值形成新对象吗?
- uart - 使用 micropython 初始化 UART 总线,我收到错误“缺少 1 需要位置参数”
- java - 如何在 100 多个现有类中创建新的类变量?
- java - 将 Eclipse 动态 Web 项目作为纯 maven 项目发布(可能吗?)
- javascript - 元素为空 - 我想我需要等待它被加载?
- ios -
UITextView 用 HTML标记字符串替换下一行符号 - android - RoomDatabase 中的所有查询都返回:查询返回的列没有字段
- batch-file - 如何一次读取一个字符的字符串或文件并将该字符的 ASCII 值分配给 CMD 批处理中的变量?