1

我试图更多地了解预处理器如何与 GCC 在 GNU/Linux 上生成的共享对象库相关。

我一直无法找到一个清晰,简洁的答案。

如果我使用预处理器语句,例如:

#ifndef __OPTI_MY_VARIABLE
#define __OPTI_MY_VARIABLE 1
#endif

我用这个编译了一个共享对象文件,并用另一个我声明的程序链接到它:

#define __OPTI_MY_VARIABLE 2

在编译使用共享对象库的主程序后,我的程序会使用值 1 还是 2?

如果它使用值 1,是否有办法构造代码以使其使用值 2,例如不使用预处理器语句?换句话说,有没有办法让我声明默认值,除非另一个同名的全局变量覆盖它,或者必须将此信息传递给共享对象中的函数?

4

2 回答 2

3

#defines 只有预处理器才能看到。预处理器在编译器之前完全运行。编译器在链接之前运行。

如果您希望能够覆盖共享对象“内部”的默认值,那么我建议使用 setter 函数和静态全局变量,例如:

#define OPTI_MY_VARIABLE_DEFAULT   1

static int opti_my_variable = OPTI_MY_VARIABLE_DEFAULT;

...

void set_opti_my_variable(int i) { opti_my_variable = i; }

显然,这使用了一个全局变量,许多人对此不屑一顾……

于 2012-06-21T00:02:16.087 回答
0

问题是错误的。

这些定义意味着在源代码中,所有出现的定义名称都在编译之前被给定的值替换。

因此,在一个共享库中,无论您在哪里使用该名称,您的值都是 1。在另一个共享库中,值是 2。共享库中不存在该名称。如果您将两个共享库与一个程序一起使用,那么第一个库中设置定义名称的任何变量都将具有值 1,而在第二个库中,值 2。

于 2012-06-21T10:23:26.593 回答