c包括前瞻性声明

时间:2012-07-16 02:09:38

标签: c

DecompileTestApplication_Program.h

#ifndef _DecompileTestApplication_Program_
#define _DecompileTestApplication_Program_
struct DecompileTestApplication_MyAnotherProgram;
#include <stdio.h>
typedef struct {
    //Variables
    int ind;
    int a;
    int b;
    int __refs__;
} DecompileTestApplication_Program;
void DecompileTestApplication_Program_Plan( DecompileTestApplication_MyAnotherProgram* );
//error: expected ')' before '*' token
#endif

DecompileTestApplication_MyAnotherProgram.h

#ifndef _DecompileTestApplication_MyAnotherProgram_
#define _DecompileTestApplication_MyAnotherProgram_
struct DecompileTestApplication_Program;
#include <stdio.h>
typedef struct {
    //Variables
    DecompileTestApplication_Program* program;
    int __refs__;
} DecompileTestApplication_MyAnotherProgram;
#endif

这又是我的IL(C#\ VB编译代码)到C反编译器。 我尝试了很少的方法来做到这一点,但没有得到任何成功的编译。 顺便说一下,我使用Dev-Cpp用原始C编译。

2 个答案:

答案 0 :(得分:0)

在C中,使用标记声明结构类型不会将裸标记声明为类型(与C ++不同)。你必须这样做:

typedef struct DecompileTestApplication_MyAnotherProgram DecompileTestApplication_MyAnotherProgram;

如果没有地平线滚动条,那就不适合SO上的一行。

或者,您每次都必须在标记前加struct

void DecompileTestApplication_Program_Plan(struct DecompileTestApplication_MyAnotherProgram*);

扩展答案

除了使用struct确保单个字是typedef的别名之外, 你还必须确保每种类型只有一个typedef

作为旁注,您的标题保护名称会侵入为实现保留的名称空间(这意味着,对于编写C编译器的人员而言)。不要那样做。一般不要使用以下划线开头的名称,特别是不要以两个下划线或一个下划线和大写字母开头的名称。

在上下文中,这意味着:

DecompileTestApplication_Program.h

#ifndef DecompileTestApplication_Program_header
#define DecompileTestApplication_Program_header
typedef struct DecompileTestApplication_MyAnotherProgram DecompileTestApplication_MyAnotherProgram;
typedef struct DecompileTestApplication_Program DecompileTestApplication_Program;
struct DecompileTestApplication_Program
{
    //Variables
    int ind;
    int a;
    int b;
    int __refs__;  // This is not safe either!
};
// Why is this function declared here and not in the other header?
void DecompileTestApplication_Program_Plan(DecompileTestApplication_MyAnotherProgram *prog);
#endif

DecompileTestApplication_MyAnotherProgram.h

#ifndef DecompileTestApplication_MyAnotherProgram_header
#define DecompileTestApplication_MyAnotherProgram_header
#include "DecompileTestApplication_Program.h"
struct DecompileTestApplication_MyAnotherProgram
{
    //Variables
    DecompileTestApplication_Program* program;
    int __refs__;  // Dangerous
};
#endif

两个标题都不自然地需要<stdio.h>

答案 1 :(得分:0)

这是C,而不是C ++。声明/定义结构不会创建新的类型名称。因此,第一个文件中的函数声明应该是

void DecompileTestApplication_Program_Plan(struct DecompileTestApplication_MyAnotherProgram);

或者您应该使用typedef:

typedef struct DecompileTestApplication_MyAnotherProgram DecompileTestApplication_MyAnotherProgram;

在这种情况下,您必须在第二个文件中省略typedef关键字,只需离开

struct XXX.... {
};