0

我正在编写一个程序来为另一个用 OpenCL 语言编写的动态程序汇编代码。出于这个问题的目的,我们假设动态程序语言是 C99,但限制是所有代码都必须放在一个编译块中。

我的较大程序确定了将在 main 函数中发生的一系列步骤,以及实现这些步骤所需的 C99 源文件。然后它调用 C99 预处理器/编译器来生成动态程序可执行文件。-D SYMBOL=defn我可以使用调用参数提供编译器宏定义。

这是一个适用于我的示例方案,并且避免了使用单独的预处理库或其他大量字符串操作工具。我将动态创建列为 mainfile.c 的字符串,其他包含的文件将实际存在。

有什么方法可以将单独的声明和定义文件合并到一个文件中?

// mainfile.c
#include "ParentDeclarationFile.txt"
#include "ChildDeclarationFile.txt"
#include "ParentDefinitionFile.txt"
#include "ChildDefinitionFile.txt"

int main()
{
    return aFunctionParent( 5 );
}

// ParentDeclarationFile.txt
typedef float Type1;
int aFunctionParent( Type1 t );

// ChildDeclarationFile.txt
int aFunctionChild( Type1 t );


// ParentDefinitionFile.txt
int aFunctionParent( Type1 t ) { return aFunctionChild( t ); }

// ChildDefinitionFile.txt
int aFunctionChild( Type1 t ) { return 2*t; }

我想要一个这样的文件,我可以 #include 两次。

// SingleParentFile.txt
#ifdef DECLARATION_MODE
    //declarations here
#else
    // definitions here
#endif

但是#define定义不会传递到#include'd文件中(编辑:结果是不正确的。)并且提供-D的定义在预处理过程中不能改变。对?第一次通过后我可以置换任何类型的预处理器状态变量吗?

注意:我试图提供一个简化的示例,它要求声明和定义部分出现在不同的代码位置。我的问题的目的不是在这个简单的示例中找到解决方法。

4

1 回答 1

0

一种简单的解决方案是#define使用宏来区分代码中的声明部分和定义部分。#define确实传播到#include文件。

// mainfile.c
#define DECLARATION_MODE
#include "ParentFile.txt"
#include "ChildFile.txt"
#undef DECLARATION_MODE
#include "ParentFile.txt"
#include "ChildFile.txt"

int main()
{
    return aFunctionParent( 5 );
}

// ParentFile.txt
#ifdef DECLARATION_MODE
    typedef float Type1;
    int aFunctionParent( Type1 t );
#else
    int aFunctionParent( Type1 t ) { return aFunctionChild( t ); }
#endif

// ChildFile.txt
#ifdef DECLARATION_MODE
    int aFunctionChild( Type1 t );
#else
    int aFunctionChild( Type1 t ) { return 2*t; }
#endif
于 2012-04-05T00:54:16.413 回答