
CGo 要求 C 结构体在引用时必须显式使用 struct 关键字(如 struct PROCESS),不能像 C++ 那样直接使用未加限定的标签名 PROCESS;否则会导致 “unknown type name” 编译错误。
cgo 要求 c 结构体在引用时必须显式使用 struct 关键字(如 struct process),不能像 c++ 那样直接使用未加限定的标签名 process;否则会导致 “unknown type name” 编译错误。
在 CGo 中,C 语言的类型规则被严格遵循——C 标准规定:仅声明 struct PROCESS { ... }; 并不会自动创建一个名为 PROCESS 的类型别名;它只定义了一个结构体标签(tag),其完整类型名是 struct PROCESS。因此,任何对该类型的引用(包括结构体内部的自引用)都必须带上 struct 前缀。
你遇到的错误 ./test.h:10:3: error: unknown type name 'PROCESS' 正源于这一行:
PROCESS *next;
此处 PROCESS 未被识别,因为 C 编译器(及 CGo 调用的 C 预处理器)并不知道 PROCESS 是一个独立类型名。
✅ 正确写法应为:
struct PROCESS {
char *name;
int os_type;
addr_t address;
struct PROCESS *next; // ✅ 显式使用 struct PROCESS
// 其他字段保持不变...
unsigned int uid;
unsigned int gid;
// ...(其余字段)
};⚠️ 注意事项:
-
不要依赖
typedef隐式简化:若希望直接使用PROCESS作为类型名,需显式添加typedef:typedef struct PROCESS { char *name; int os_type; addr_t address; struct PROCESS *next; // ...其他字段 } PROCESS;此后
PROCESS *next;才合法。 -
确保头文件包含顺序与依赖一致:
addr_t类型需由<sys></sys>或<stdint.h></stdint.h>提供(注意:<sys></sys>不一定导出addr_t,建议显式包含<sys></sys>或<stdint.h></stdint.h>)。 -
CGo 不支持 C++ 特性:即使你的纯 C 环境能通过某些编译器扩展(如 GCC 的
-fms-extensions)容忍无struct前缀的用法,CGo 使用的是标准 C 模式,必须符合 ISO C99/C11 规范。
? 小结:
CGo 的 C 代码段本质是嵌入的标准 C 代码,而非“类 C 语法糖”。始终牢记:结构体标签 ≠ 类型名;自引用、函数参数、变量声明中,一律使用 struct TagName 形式,或通过 typedef 显式创建类型别名。这是避免 unknown type name 类错误的根本原则。

















