c++ - 我可以将 C/C++ #defines 设为私有(private)吗?

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

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

  • glib-2.0
  • gtk+-2.0
  • 塔(C++)
  • 基因组

My other question让我更进一步。


  1. 我可以做 #define私有(private)以便没有其他源文件永远能够使用私有(private)定义 ?

回答:是的,在 C 或 cpp 文件中(虽然它们的 header 不公开那些定义)

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

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

  3. 问题可能是如果我创建一个全局 #define null或者什么,然后包含的库可能在我的项目中有相同的定义名称错误?


    我一步一步地开始了这个项目,一次包括一个库,如果出现问题就解决问题。然后包含下一个库并修复问题等。我使用的是 eclipse,我包含了 guards 和混合的 c 和 cpp 源文件。

最佳答案

使预处理器宏“私有(private)”的唯一方法是在源文件中定义它们。然后它们将仅可用于该源文件。

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

此外,当您使用 #define 定义宏时,它实际上并不是按照编译器和链接器的定义方式定义的。预处理器阶段运行后,生成的翻译单元中不再有宏名称。

您可能想阅读有关 translation units 的内容,并了解预处理器和编译器的工作原理。


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

使用例如pkg-config 以获取编译器和链接器标志。首先,在实际将源文件编译成目标文件时,您只需要编译器标志(--cflags 参数)。然后,在链接时,您只需要链接器标志(--libs 标志到 pkg-config),生成的标志应该放在命令行的最后(因为链接器在依赖库的对象文件之后需要库。

关于c++ - 我可以将 C/C++ #defines 设为私有(private)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116284/

相关文章:

c - c中的数组数组

Swift重写静态方法编译报错

c++ - 用 memcopy、memmove 或 std :copy? 替换 For 循环

c - 以下是VS2012的一些汇编代码,我如何在gcc上编写它?

c - 进程退出,返回值 3221225477

compiler-errors - ifort composer_xe_2015.3.187的编译问题

c - 错误: expected ‘}’ before ‘else’ ?

C++ 双释放或损坏(出): Even with copy constructor and assignment operator

c++ - 使用 C++ 查找系统电源状态

c++ - GCC 导致 lambda 捕获的参数包出现段错误