小编Gre*_*ers的帖子

使用字符串文字作为使用三元运算符的表达式的结果是否有效/建议?

以下代码在 C 语言中有效/良好实践吗?

int x = 1;
printf(x == 1 ? "%d second elapsed" : "%d seconds elapsed", x);
Run Code Online (Sandbox Code Playgroud)

它编译得很好,所以我认为它很好(也因为它只是 if-else 块的语法糖),但如果有人有一些额外的见解,我将不胜感激,谢谢。

PS,我想 C++ 也是如此?

c conditional-operator string-literals

5
推荐指数
1
解决办法
121
查看次数

如何在 MacOS 上正确使用“write”系统调用打印到标准输出?

我看过类似的问题,但似乎找不到我的代码有什么问题。

我正在尝试在 MacOS 上进行“write”系统调用以将字符串打印到标准输出。

我能够printf完美地做到这一点,并且熟悉在 x64 汇编中调用其他函数。

然而,这是我第一次尝试syscall

我正在使用 GCC 的 GAS 汇编器。

这是我的代码:

.section __TEXT,__text

.globl _main

_main:
    pushq %rbp
    movq %rsp, %rbp

    subq $32, %rsp

    movq $0x20000004, %rax
    movq $1, %rdi
    leaq syscall_str(%rip), %rsi
    movq $25, %rdx
    syscall

    jc error

    xorq %rax, %rax

    leave
    ret

error:
    movq $1, %rax
    leave
    ret

.section __DATA,__data
syscall_str:
    .asciz "Printed with a syscall.\n"
Run Code Online (Sandbox Code Playgroud)

看起来没有任何错误;根本没有写入任何内容stdout

我知道它start通常用作 MacOS 上可执行文件的起点,但它不能使用 GCC 进行编译。

macos assembly x86-64 gnu-assembler system-calls

5
推荐指数
1
解决办法
419
查看次数

为什么命名空间内定义的 << 运算符不参与重载解析?

在以下场景中,operator<<函数参与重载解析(当它位于全局命名空间中时):

template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
    os << '[';
    for (const T &val : vec)
        os << val << ", ";
    return os << "\b\b]";
}
Run Code Online (Sandbox Code Playgroud)

...但是下面,当在名称空间内定义时,它不会:

namespace blah {
    template <typename T>
    std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
        os << '[';
        for (const T &val : vec)
            os << val << ", ";
        return os << "\b\b]";
    }
}
Run Code Online (Sandbox Code Playgroud)

当从 调用时main,如下所示:

int main() {
    std::vector<int> vec{5, 4, 3, 6, …
Run Code Online (Sandbox Code Playgroud)

c++ namespaces operator-overloading overload-resolution name-lookup

2
推荐指数
1
解决办法
64
查看次数