Go語言調用C語言函數的坑

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

最近在看人民郵電出版社 許式偉 呂桂華編著的《Go語言編程》,看到【1.2.9 語言互動性】小節的cprint.go。未按照書中原始碼格式編寫,而是把 import "C" 和 import "unsafe" 合并放入小括弧中並和注釋結束符 */ 間隔了一行,這也是大多數Go語言學習和開發人員經常使用的代碼風格,我修改後的代碼如下:

package main

/*
#include <stdio.h>
#include <stdlib.h>
*/

import (
    "C"
    "unsafe"
)

func main() {
    cstr := C.CString("Hello, world")
    C.puts(cstr)
    C.free(unsafe.Pointer(cstr))
}

結果在我的Windows 7 64位和CentOS 6.6 x86_64環境下go build cprint.go或者go run cprint.go都一直報錯如下:

# command-line-arguments

error: 'puts' undeclared (first use in this function)

error: 'free' undeclared (first use in this function)


尋找了很多文檔,研究了3天,一直未找到原因,包括換成舊版Go語言SDK,也未能解決。

偶爾看到一篇英文文檔,地址:http://stackoverflow.com/questions/18237738/linking-golang-with-xlib,提示匯入虛擬包C的格式必須單獨起一行,並且緊跟在注釋結束行後,於是重新按照提示修改後編譯和運行都通過了,嚴格按照《Go語言編程》書本格式編寫也正常。

修改後正常的代碼如下:

package main

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

import (
    "unsafe"
)

func main() {
    cstr := C.CString("Hello, world")
    C.puts(cstr)
    C.free(unsafe.Pointer(cstr))
}
   

Go語言的代碼格式非常嚴格,廣大Go語言愛好者有時經常不小心修改了格式或者使用了其他語言風格格式,編譯和運行都有可能出現各種莫名其妙的問題。再次提醒大家:import "C" 一定要緊跟C語言代碼注釋結束的最後一行,絕對不能空出一行,也不能和其他包合并寫到import小括弧內。

   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.