package main
/*
#include <stdio.h>
void myhello(int i) {
printf("Hello C: %d\n", i)
}
*/
import "C"
import "fmt"
func main() {
C.myhello(C.int(12))
fmt.Println("Hello Go")
}
需要注意的是C代码必须放在注释里面
import "C"语句和前面的C代码之间不能有空行
运行结果
$ go build main.go &&./main
Hello C: 12
Hello Go
分开c代码到单独文件
嵌在一起代码结构不是很好看,很多人包括我,还是喜欢把两个分开,放在不同的文件里面,显得干净,go源文件里面是go的源代码,c源文件里面是c的源代码。
$ ls
hello.c hello.h main.go
$ cat hello.h
void hello(int)
$ cat hello.c
#include <stdio.h>
void hello(int i) {
printf("Hello C: %d\n", i)
}
$ cat main.go
package main
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go")
}
编译运行
$ go build &&./main
Hello C: 12
Hello Go
编译成库文件
如果c文件比较多,最好还是能够编译成一个独立的库文件,然后go来调用库。
$ find mylib main
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go
编译库文件
$ cd mylib
# gcc -fPIC -shared -o libhello.so hello.c
编译go程序
$ cd main
$ cat main.go
package main
// #cgo CFLAGS: -I../mylib
// #cgo LDFLAGS: -L../mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go")
}
$ go build main.go
运行
$ export LD_LIBRARY_PATH=../mylib
$ ./main
Hello C: 12
Hello Go
在我们的例子中,库文件是编译成动态库的,main程序链接的时候也是采用的动态库
$ ldd main
linux-vdso.so.1 => (0x00007fffc7968000)
libhello.so =>../mylib/libhello.so (0x00007f513684c000)
libpthread.so.0 =>/lib64/libpthread.so.0 (0x00007f5136614000)
libc.so.6 =>/lib64/libc.so.6 (0x00007f5136253000)
/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)
理论上讲也是可以编译成整个一静态链接的可执行程序,由于我的机器上缺少静态链接的系统库,比如libc.a,所以只能编译成动态链接。
void是C语言中的一个关键字,字面意思是“无类型”,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明,有注释和限制程序的作用。void *可以指向任何类型的数据,在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,定义一个void变量没有意义,不妨试着定义:
void真正发挥的作用在于:
1、 对函数返回的限定
2、对函数参数的限定
你的代码是想把front到rear的值全部输出但是你下面的操作自己检查一下没有改变front的值,也没有改变rear的值,所以front!=rear是死循环
如果好一点的话
void printQueue(LinkQueue *Q)/*依次输出队列*/
{
if(Q->front==Q->rear)
{
printf("队列为空")
exit(1)
}
while(Q->front!=Q->rear)/*老师告诉我说是这里的while是死循环,为什么是死循环呢,不是很懂,请细说。请帮我改为正确的代码,谢谢。*/
{
printf("%d, ", Q->front->data)
Q->front=Q->front->next
}
//exit(0)
}试试可不可以,不行再追问