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

标签 c include c-preprocessor c99

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

相关文章:

c - 标准错误报告

c - GCC __builtin_constant_p 总是返回 0

C - Return 语句不退出 void 函数

c++ - 编译器如何知道在哪里可以找到#include <stdio.h>?

sql - 如何从 PostgreSQL 中的 sql 脚本导入外部 sql 脚本?

c++ - 在 C++ 中连接#define

c - 如何使用在同一 CPU 上运行的调试器读取 CPU 寄存器?

php - PHP 的单个大文件还是许多小文件?

c++ - C 与 C++ 为什么这个宏不扩展为常量?

c++ - 替换循环缓冲区/fifo 队列数组元素中的 "FOR()"宏