macos - 无法打印到标准输出

标签 macos go macos-high-sierra cgo

我能够得到程序 here按预期打印 42。

但我无法让以下程序打印到标准输出:

package main

// #include <stdlib.h>
// #include <stdio.h>
import "C"

import (
    "unsafe"
)

func main() {
    cs := C.CString("hello")
    defer C.free(unsafe.Pointer(cs))
    C.fputs(cs, (*C.FILE)(C.stdout))
}

它运行没有错误,但它不打印任何东西。上面的代码片段主要基于“字符串和事物”代码 here .

最佳答案

试试这个:

package main

// #include <stdlib.h>
// #include <stdio.h>
import "C"
import "unsafe"

func main() {
    cs := C.CString("hello")
    defer C.free(unsafe.Pointer(cs))
    C.puts(cs)
}

解释:

fputs 方法将一个字符串写入数据流,在您的例子中是 stdout,它指向一个指向不存在的文件的指针,因为它之前既没有打开也没有在任何地方定义.因此,即使程序看起来执行无误,您也看不到任何标准输出,因为它被重定向到一个不存在的文件。

此外,应该注意的是,只需从 Strings and things 中删除代码在没有一些自定义的情况下进入主程序的部分将不起作用,因为它在博客中作为一个包提供,这就是为什么存在文件存在混淆的原因。博客文章中的 print 包似乎只是假设您尝试将数据流写入的文件已经在之前的某个地方定义过。这有点令人困惑,他们可能应该对此进行调整。

我用 puts 替换了 fputs 并删除了指向文件的指针,程序执行得很好。

希望即使进行了修改,这也有助于实现您正在寻找的目标!

关于macos - 无法打印到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51394968/

相关文章:

xcode - High Sierra 上的 Home-brew 安装失败

在 OSX 上使用 C 编译或使用 libxml

ios - 在 OSX 和 IOS 应用程序之间共享代码的最佳实践

multithreading - Go 运行时使用的线程数

git - MacOS Sierra 更新后如何修复 git 路径?

php - fatal error : Call to undefined function sqlsrv_connect() High Sierra

linux - 如何将 ls 权限设置为绿色?

macos - 如何为 macOS 设置 CoreLocation 使用说明?

dictionary - go lang 根据过滤条件构建 map

c# - 从其他项目protobuf文件导入消息类型