c++ - 使用未定义的宏构建一个库

标签 c++

如果我有两个项目和一个库。该库需要一个已定义的宏,所以

/* mylib.cpp */
int stack[STACK_SIZE];

在项目 1 中,Stack Size 需要定义为:

/* project_1_main.cpp */
#define STACK_SIZE 50

对于项目 2,堆栈大小需要不同

/* project_2_main.cpp */
#define STACK_SIZE 800

有没有办法用一个未定义的宏构建一个库,然后留给项目去定义?

我正在使用 GCC 编译器,C++03,但不允许我将库转换为模板。

编辑:根据您的输入,我决定不预编译库,使用目录作为包含的源文件,然后添加 -D STACK_SIZE=50 选项以对每个项目进行相应大小的编译。更长的干净构建,但它是干的。

最佳答案

不,这是不可能的。在作为库的一部分的源文件中使用的宏必须在编译库时定义;稍后在另一个源文件中重新定义宏不会改变库的行为。

如果您需要库的行为是可修改的,您很可能需要根据传递给库中函数的值动态分配此数组,例如

int *stack = NULL;
size_t stack_size = 0;

void mylib_init_stack(size_t size) {
    if (stack == NULL) {
        stack = malloc(size * sizeof(int));
        stack_size = size;
    } else {
        fprintf(stderr, "mylib ERROR: stack already initialized\n");
    }
}

并在启动应用程序时调用该函数来初始化库。

关于c++ - 使用未定义的宏构建一个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29852463/

相关文章:

c++ - 无法从导入的类 C++ 调用非静态成员函数

c++ - 如何用Qt5编译QwtPlot3d?

c++ - 如何使用 STL::map 作为二维数组

C++ 内存调试器?

c++ - friend 混入模板?

c++ - 在 C++11(或更高版本)中从字节数组反序列化对象的无未定义行为方式是什么?

c++ - OpenCL POCL + asan 或 valgrind

c++ - 在 'this' 指针上使用 placement new 是否安全

c++ - 重载可变模板成员函数和可变模板函数

android - mpeg2 ts android ffmpeg openmax