duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
Forwarded from Richard Yu
因为不是C/C++,谁知道有没有指针?没的话那就传个0吧。C++我会写nullptr。
Forwarded from dnaugsuz
如果没有指针类型的话也是可能的,但是,如果是我也会搞个全局的常量 nullptr, 尽可能避免混淆

如果类型系统菜,程序员负责给它洗地
Forwarded from Richard Yu
"" 不代表 nullptr,它是有一个地址的。
Forwarded from dnaugsuz
是啊,所以我说是一个常量

const char *EMPTY_CHARP = "";

这里我没有指定具体分配位置,但它是常量,换句话说编译器喜欢内联也可以直接翻译成

GetModuleHandle("");

或者

const static char EMPTY_CHARP[] = {'\0'};

然后
GetModuleHandle(EMPTY_CHARP);
Forwarded from dnaugsuz
是啊,所以 "" 不是一个地址指针嘛?即便它可能被分配在本地
Forwarded from Richard Yu
那结果就和直接传0不一样了。
Forwarded from Yuuta
看神仙讨论中(
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 printf
Forwarded from Yuuta
汇编大佬 我死了
Forwarded from Richard Yu
我说的是 GetModuleHandle 的情况啊,上面的情况是要传0进去。
Forwarded from dnaugsuz
😵 那我就完全糊涂了... 总之我上面的情况你支持吧?
之前的 GetModuleHandle 的处理,反正我不是 Win32 的程序员,算了吧
Forwarded from Richard Yu
不支持,有这种需求的情况下直接写 "" 不就好了?
Forwarded from dnaugsuz
也没有,你想想 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 Richard Yu
我不觉得
Forwarded from dnaugsuz
GetModuleHandle 不是正常情况使用非 NULL char* 调用嘛
我之前一直是以这个前提发的消息,没有考虑输入 NULL 的情况
Forwarded from Richard Yu
传null获取当前程序的基址也是正常情况。甚至可以说是主要用途。
Forwarded from dnaugsuz
也就是说 NULL"" 都支持?

procedure GetModuleHandle(char *modname)
match args
[NULL] -> return GetModuleHandle("")
otherwise -> return RealGetModuleHandle(args)
Forwarded from dnaugsuz
噢... 我之前以为 "" 就是你说的 NULL 自身特例
听起来也很符合直觉,不过可能 NULL 更好一些