我的项目必须是C ++。我包括:
My other question让我更进一步。
#define
设为私有,以便其他源文件不会 EVER 能够使用私有定义吗?回答:是的,在C或cpp文件中(虽然它们的标题不公开这些定义)
我是否必须包括所有库两次(对于两个编译器:GCC C,GCC C ++)? (我将在cpp文件中使用C库)。还有链接器?
我正在使用`pkg-config --cflags --libs glib-2.0 gtk + -2.0` 修复“找不到文件”的致命错误。但我仍然得到它们(例如找不到glibconfig.h~文件)。是否有一个万无一失的解决方案?
问题可能是,如果我制作全局#define null
或其他内容,那么可能所包含的库在我的项目中有相同的定义名称错误?
答案 0 :(得分:9)
使预处理器宏“私有”的唯一方法是在源文件中定义它们。然后它们将仅可用于该源文件。
您必须记住,预处理器(处理宏和#include
指令)实际上是在实际编译器看到源之前运行的单独步骤。
此外,当您使用#define
定义宏时,实际上并没有以与编译器和链接器相同的方式定义它。运行预处理器阶段后,结果转换单元中不再有宏名称。
您可能希望了解translation units,并了解预处理器和编译器的工作原理。
对于您的第二点,您实际上并不是仅仅使用C ++编译器两次构建项目两次。因此,在链接项目时,您应该只指定一次库。
使用例如,你也应该小心pkg-config
获取编译器和链接器标志。首先,在将源文件实际编译为目标文件时,只需要编译器标志(--cflags
参数)。然后在链接时你只需要链接器标志(--libs
标志到pkg-config
),结果标志应该是命令行的最后一个位置(因为链接器需要依赖于目标文件的库)图书馆)。
答案 1 :(得分:2)
你可以这样
#define X 5
int a = X;
#undef X
请记住,define是预处理器指令,#incldue也是如此。
定义将忽略范围,它将应用于#define
和#undef
之间的任何包含文件
这通常是不好的做法,可能导致维护噩梦。避免是可能的。
答案 2 :(得分:1)
首先,您可能想了解有关预处理器和编译过程的更多信息,但现在问题是:
1)我可以将#define设为私有,以便其他源文件不能使用私有定义吗?
没有私人#define
这样的东西。但是,您可以使用#undef
在使用后取消定义它或仅将它们放在.c / .cpp文件中。
2)我是否必须包括所有库两次(对于两个编译器:GCC C,GCC C ++)? (我将在cpp文件中使用C库)。还有链接器?
在编译步骤中,您无需在以后指定要链接的库。编译器只对您使用的库的头文件感兴趣。
然后,链接器需要实际的库文件将目标文件与库链接。
3)我正在使用
pkg-config --cflags --libs glib-2.0 gtk+-2.0
修复“找不到文件”的致命错误。但我仍然得到它们(例如找不到glibconfig.h~文件)。那是否有一个万无一失的解决方案?
您可以通过正确设置包含路径来执行此操作。对不起,我不知道如何在日食中做到这一点。
4)问题可能是,如果我创建一个全局#define null或者某个东西,那么包含的库可能在我的项目中有相同的定义名称错误?
我怀疑在你没有找到头文件的情况下,但这让我想起了
#define true false
以及所有这些笑话......