c - 如何从另一个文件更改#define 值
问题描述
我有一个源文件和头文件:
//boot.h
#define BOOT_DATA_ADDRESS EMBEDDED_ADDRESS
void BootDataReadTable(bootData_t * bootData);
//boot.c
void BootDataReadTable(bootData_t * bootData)
{
uint32_t *userPageBootDataTable = (uint32_t *) (BOOT_DATA_ADDRESS );
uint32_t copiedDataTable[BOOT_DATA_WORDS] = {0U};
for (uint32_t i = 0; i < BOOT_DATA_WORDS; i++)
{
copiedDataTable[i] = userPageBootDataTable[i];
}
unpackBootData(copiedDataTable, bootData);
}
和一个测试文件:
//test_boot.c
#include "bootdata.h"
#ifdef BOOT_DATA_ADDRESS
#undef BOOT_DATA_ADDRESS
#define BOOT_DATA_ADDRESS (stackpointer)
#endif
static uint32_t stack[0x2000] = {0};
static uint32_t * stackpointer = &stack[0];
void test_BootDataReadTable(void)
{
bootData_t lBootData = {0};
BootDataReadTable(&lBootData, (uint32_t *)addr);
//test lBootData
}
此代码在嵌入式平台上运行。内存访问BootDataReadTable
访问 MCU 上的内部闪存。出于单元测试的目的,我想在我的主机上运行它。在test_boot.c
我想更改BOOT_DATA_ADDRESS
指向我的主机上的堆栈区域,以便BootDataReadTable
只访问一些虚拟数据而不是尝试访问内部闪存。
我正在编译/运行单元测试ceedling
。
我上面使用的方法不起作用。我在做什么错/如何完成BOOT_DATA_ADDRESS
从另一个文件更改值?
解决方案
由于您这样做是为了进行单元测试,我假设您专门为单元测试编译没有问题(甚至可能不是针对目标架构)。
env.h
:
#ifdef UNIT_TESTING
extern int stack[0x2000];
#define BOOT_DATA_ADDRESS (stack)
#endif
boot.h
:
#include "env.h"
#ifndef BOOT_DATA_ADDRESS
#define BOOT_DATA_ADDRESS ((void *)0xdeadbeef)
#endif
void BootDataReadTable(void);
boot.c
:
#include <stdio.h>
#include "boot.h"
void BootDataReadTable(void)
{
printf("BOOT_DATA_ADDRESS = %p\n", BOOT_DATA_ADDRESS);
}
main.c
:
#include "boot.h"
int main(int argc, char **argv)
{
BootDataReadTable();
}
test_boot.c
:
#include "boot.h"
int stack[0x2000] = {0};
void test_BootDataReadTable(void)
{
BootDataReadTable();
}
int main(int argc, char **argv)
{
test_BootDataReadTable();
}
Makefile
:
demo: main test_boot
./main
./test_boot
main::
cc -o main main.c boot.c
test_boot::
cc -DUNIT_TESTING -o test_boot test_boot.c boot.c
输出:
cc -o main main.c boot.c
cc -DUNIT_TESTING -o test_boot test_boot.c boot.c
./main
BOOT_DATA_ADDRESS = 0xdeadbeef
./test_boot
BOOT_DATA_ADDRESS = 0x601060
推荐阅读
- typescript - 生成的 typescript dtos 使用尖括号断言
- php - 使用类常量作为枚举
- java - 如何使用带有 Gradle 的 JavaFX 更改工作目录?
- mysql - MySQL 未在 XAMP 和 HeidiSQL 上启动
- python - AssertionError: HybridBlock 要求转发的第一个参数是 Symbol 或 NDArray,但是得到了
- matlab - 如何使用正交投影 3D 绘制参数曲线?
- ruby-on-rails - Rspec Rails - 在请求规范中模拟远程请求
- npm - 已解决:`gatsby develop` 产生错误:EISDIR:对目录的非法操作,读取 .cache 文件夹上的链接
- java - 如何修复从 Excel 输入到网页的数据
- scala - 如何传递命令行参数scala