gpt4 book ai didi

c - 如何获得复杂的 C 预处理器行为以简化动态程序汇编

转载 作者:行者123 更新时间:2023-11-30 18:01:07 25 4
gpt4 key购买 nike

我正在编写一个程序来为另一个用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com