类型定义不完整后的Typedef



我需要在头文件中声明不完整类型(可能是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) { /* */ };

相关内容

  • 没有找到相关文章

最新更新