我需要在头文件中声明不完整类型(可能是siginfo_t
),并在源文件中导入一些系统头文件(sys/signal.h
),定义该类型。
那么,问题来了:
// a.h
struct siginfo_t;
void foo(siginfo_t*);
// a.cpp
#include "a.h"
#include <signal.h>
void foo(siginfo_t* x) { /* implementation */ };
但是在signal.h中定义为:
typedef struct siginfo_t { /* */ } siginfo_t;
编译错误:error: typedef redefinition with different types ('struct siginfo_t' vs 'siginfo_t')
.
如何实现无错误?谢谢!
在标题<sys/siginfo.h>
中,类型定义名称siginfo_t
是未命名结构体的别名
typedef struct {
int si_signo;
int si_code;
union sigval si_value;
int si_errno;
pid_t si_pid;
uid_t si_uid;
void *si_addr;
int si_status;
int si_band;
} siginfo_t;
但是您为命名结构
引入了相同的别名typedef struct siginfo_t { /* */ } siginfo_t;
编译器发出错误
错误:typedef redefinition with different types ('struct siginfo_t')vs siginfo_t)
,因为您可能不会为命名结构和未命名结构引入相同的别名。这些结构是不同的类型。
所以,有正确的方法:
// a.h
#pragma once
extern "C" {
struct siginfo;
}
void foo(siginfo*);
// a.cpp
#include "a.h"
#include <sys/siginfo.h>
void foo(siginfo* x) { /* */ };