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

Bit*_*lue 1 c c++ compiler-errors c-preprocessor

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

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

我的另一个问题让我更进一步.


  1. 我可以#define私有,以便没有其他源文件永远不能使用私有定义

回答:是的,在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源文件.

Som*_*ude 9

使预处理器宏"私有"的唯一方法是在源文件中定义它们.然后它们将仅可用于该源文件.

您必须记住,预处理器(处理宏和#include指令)实际上是在实际编译器看到源之前运行的单独步骤.

此外,当您使用宏定义宏时#define,它实际上并没有以与编译器和链接器相同的方式定义.运行预处理器阶段后,生成的转换单元中不再有宏名称.

您可能希望阅读有关翻译单元的内容,并了解预处理器和编译器的工作原理.


对于您的第二点,您实际上并不是仅仅使用C++编译器两次构建项目两次.因此,在链接项目时,您应该只指定一次库.

在使用eg pkg-config获取编译器和链接器标志时也应该小心.首先,--cflags在将源文件实际编译为目标文件时,只需要编译器标志(参数).然后在链接时只需要链接器标志(--libs标志为pkg-config),结果标志应该是命令行的最后位置(因为链接器需要在依赖于库的目标文件之后的库).