我可以将C / C ++ #defines设为私有吗?

时间:2013-11-21 08:54:25

标签: c++ c compiler-errors c-preprocessor

我的项目必须是C ++。我包括:

  • 油嘴-2.0
  • GTK + -2.0
  • pylon(C ++)
  • GenICam标准

My other question让我更进一步。


  1. 我可以将#define设为私有,以便其他源文件不会 EVER 能够使用私有定义吗?
  2. 回答:是的,在C或cpp文件中(虽然它们的标题不公开这些定义)

    1. 我是否必须包括所有库两次(对于两个编译器:GCC C,GCC C ++)? (我将在cpp文件中使用C库)。还有链接器?

    2. 我正在使用`pkg-config --cflags --libs glib-2.0 gtk + -2.0` 修复“找不到文件”的致命错误。但我仍然得到它们(例如找不到glibconfig.h~文件)。是否有一个万无一失的解决方案?

    3. 问题可能是,如果我制作全局#define null或其他内容,那么可能所包含的库在我的项目中有相同的定义名称错误?

      <小时/> 我一步一步地启动了项目,包括一次一个库,并解决了一些问题。然后包括下一个库并修复问题等。我正在使用eclipse,我已经包含了警卫和混合c和cpp源文件。

3 个答案:

答案 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

以及所有这些笑话......