gpt4 book ai didi

c - 从不同文件部分初始化 C 数组

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

我的目标是在一个 C 文件中实例化一个数组,并仅通过声明性代码在不同的文件中初始化该数组,即,如果以下内容可行,那就太棒了:

// File1.c
int myArray[2];

// FileA.c
myArray[0] = 123;

// FileB.c
myArray[1] = 345;

这里的关键是 FileA 和 FileB 中的代码没有被执行,但我希望看到的是编译器拾取这些语句来初始化 myArray。

我在这里真正想要完成的是某种形式的基于编译的服务注册。也就是说,在我的真实代码中,数组将保存指向函数的指针,而我的“main”(在 File1.c 中)将不知道哪些特定函数被编译到图像中。通过不同的 makefile,我将编译文件的不同组合(FileA、FileB、FileC...),并通过指针将它们实现的函数提供给我的 main。

有人知道如何实现这一目标吗?

最佳答案

您无法跨多个文件逐段初始化数组。一个文件中只允许使用一个初始值设定项。所以,这个想法不会直接起作用。

如何让它发挥作用?你有指向函数的指针;我假设它们都有相同的签名,出于本次讨论的目的,可以是 int function(int arg)(细节并不重要)。它将在 header 中定义,并且 File1.c 将需要该 header 。

typedef int (*Function)(int arg);

每个服务提供程序文件都会有一个关联的 header ,FileA.c 有一个 header FileA.h,依此类推。

初始化数组的代码可以位于File1.c 中或单独的文件中。无论它在哪里,都必须知道要链接哪些模块(服务):

#include "configuration.h"
#include "FileA.h"
#include "FileB.h"
#include "FileC.h"

Function services[] =
{
#ifdef INCLUDE_SERVICE_A
A_service_function,
#endif
#ifdef INCLUDE_SERVICE_B
B_service_function,
#endif
#ifdef INCLUDE_SERVICE_C
C_service_function,
#endif
};
size_t num_services = sizeof(services) / sizeof(services[0]);

这种方案的好处是数组中不会浪费空间。如果没有请求这三个服务中的任何一个,它也不会编译。构建系统将确保 configuration.h 包含正确的定义。每个服务的 header 声明服务功能。

这样就给出了可行方案的轮廓。

关于c - 从不同文件部分初始化 C 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24914207/

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