2014-10-16 1 views
0

У меня есть следующий простой тестовый код Go: call_c.go

package main 

/* 
int getData(int *p, int n) 
{ 
    int i; 
    for(i=0;i<n;i++) { 
     p[i]=i; 
    } 
    return n; 
} 
*/ 
import "C" 
import "fmt" 

func main() { 
    var a [5]int32 
    i := C.getData((*C.int)(&a[0]), 5) 
    fmt.Println(i, a) 
} 

Я использую «идти строить call_c.go», чтобы построить программу и строит отлично.Вызов функции c, порядок «импорт fmt», «импорт C» вызывает ошибку сборки, почему?

Но я обнаружил, что если я просто изменил порядок «import fmt», «import C» или добавил новую строку между C/* */block code и первым импортером, «go build call_c.go "команда возвращает ошибку:

go build call_c.go 
37: error: 'getData' undeclared (first use in this function) 

Вопросы для экспертов сусликов там:

Почему порядок импорта важно в ходу?

Почему я не могу добавить пробел между блоком C и первым оператором импорта?

Если я снова вижу такую ​​ошибку, как лучше ее отладить?

ответ

2

Порядок импорта arn't обычно важен. Но import "C" очень особенный при использовании cgo.

От docs:

If the import of "C" is immediately preceded by a comment, that comment, called the preamble, is used as a header when compiling the C parts of the package. For example:

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

Так что, если у вас есть перевод строки между вашим комментарием, который содержит код C, и import "C", то комментарий является просто еще один комментарий, а не обрабатывается cgo.

Аналогично, если изменить порядок импорта:

/* 
int getData(int *p, int n) 
{ 
    int i; 
    for(i=0;i<n;i++) { 
     p[i]=i; 
    } 
    return n; 
} 
*/ 
import "fmt" 
import "C" 

Код в комментарии просто еще один комментарий и не обрабатывается ОЦП, так как не сразу после импорта «C». (или, скорее, import "C" не предшествует комментарию)

+0

Хороший ответ! Это первый раз, когда я ввожу язык, где новая строка может вызвать ошибку компиляции. Теперь я знаю, почему. Еще раз спасибо. –

0

Это важно только потому, что это способ, инструмент определяется для работы - golang.org/cmd/cgo/

Много Go-инструмент цепи условности основы, и вы должны следовать соответствующим соглашениям для того, чтобы работать должным образом.

Смежные вопросы