Forwarded from Richard Yu
因为不是C/C++,谁知道有没有指针?没的话那就传个0吧。C++我会写nullptr。
Forwarded from dnaugsuz
如果没有指针类型的话也是可能的,但是,如果是我也会搞个全局的常量
如果类型系统菜,程序员负责给它洗地
nullptr, 尽可能避免混淆如果类型系统菜,程序员负责给它洗地
Forwarded from dnaugsuz
是啊,所以我说是一个常量
const char *EMPTY_CHARP = "";
这里我没有指定具体分配位置,但它是常量,换句话说编译器喜欢内联也可以直接翻译成GetModuleHandle("");
或者const static char EMPTY_CHARP[] = {'\0'};
然后 GetModuleHandle(EMPTY_CHARP);
Forwarded from dnaugsuz
printf(EMPTY_CHARP); 的 x86 翻译结果是mov rdi, qword ptr [EMPTY_CHARP]
mov dword ptr [rbp - 4], eax # 4-byte Spill
mov al, 0
call printf
xor ecx, ecx
mov dword ptr [rbp - 8], eax # 4-byte Spill
上面一句 printf(""); 是movabs rdi, offset .L.str
mov al, 0
call printf
似乎和 printf(0); 是有区别的mov al, 0
call printfForwarded from Richard Yu
我说的是 GetModuleHandle 的情况啊,上面的情况是要传0进去。
Forwarded from dnaugsuz
😵 那我就完全糊涂了... 总之我上面的情况你支持吧?
之前的 GetModuleHandle 的处理,反正我不是 Win32 的程序员,算了吧
之前的 GetModuleHandle 的处理,反正我不是 Win32 的程序员,算了吧
Forwarded from dnaugsuz
也没有,你想想
上面那条
你用 x86 作为目标机器再编译一遍就会发现都是用机器栈传参数的
sizeof(char *) 是 4上面那条
call printf 指令是跳转子程序mov dword ptr [rbp - 4], eax
你知道这是赋值第二个参数(vararg)就可以了,前面 eax 的值肯定是 0 (xor eax, eax)mov rdi, qword ptr [EMPTY_CHARP]
使用 rdi 寄存器传递是因为这是 x86_64 (long mode 支持)你用 x86 作为目标机器再编译一遍就会发现都是用机器栈传参数的
Forwarded from dnaugsuz
我之前是说有人觉得
等等我理解你的意思了,原来
"" 不优雅的情况,就不用 nullptr 替换了....等等我理解你的意思了,原来
nullptr 的确和 "" 是不一样的... 但我之前没有说他们一样啊...Forwarded from dnaugsuz
GetModuleHandle 不是正常情况使用非 NULL char* 调用嘛
我之前一直是以这个前提发的消息,没有考虑输入 NULL 的情况
我之前一直是以这个前提发的消息,没有考虑输入 NULL 的情况
Forwarded from dnaugsuz
也就是说
NULL 和 "" 都支持?procedure GetModuleHandle(char *modname)
match args
[NULL] -> return GetModuleHandle("")
otherwise -> return RealGetModuleHandle(args)Forwarded from dnaugsuz
噢... 我之前以为 "" 就是你说的 NULL 自身特例
听起来也很符合直觉,不过可能 NULL 更好一些
听起来也很符合直觉,不过可能 NULL 更好一些