我正在编写一个程序来为另一个用 OpenCL 语言编写的动态程序汇编代码。出于本问题的目的,我们假设动态程序语言是 C99,并限制所有代码必须放入单个编译 block 中。
我的大型程序确定了主函数中将发生的一系列步骤,以及实现这些步骤需要哪些 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
定义在预处理过程中不能更改。正确的?
是否有任何类型的预处理器状态变量可以在第一次传递后进行排列?
注意:我尝试提供一个简化的示例,该示例要求声明和定义部分出现在单独的代码位置。我的问题的目的不是在这个简单的例子中找到解决方法。
最佳答案
一个简单的解决方案是#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
关于c - 如何获得复杂的 C 预处理器行为以简化动态程序汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021178/