我的目标是在一个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 ...),并通过指针将它们实现的功能提供给我的主。
有谁知道如何做到这一点?
答案 0 :(得分:1)
您无法跨多个文件初始化数组。您只能在一个文件中使用一个初始化程序。所以,这个想法不会直接起作用。
你怎么能让它发挥作用?你有指向函数的指针;我假设他们都有相同的签名,为了讨论的目的可以int function(int arg)
(细节无关紧要)。它将在标题中定义,File1.c
需要该标题。
typedef int (*Function)(int arg);
每个服务提供商文件都有一个关联的标头,FileA.c
有一个标头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
包含正确的定义。每服务标头声明了服务功能。
这样就概述了一个可行的方案。