【问题标题】:MACRO depending on its folder locationMACRO 取决于其文件夹位置
【发布时间】:2015-03-31 08:31:02
【问题描述】:

在以下文件中:

app/main.cpp
app/config.hpp
app/show.hpp
app/file.hpp

lib/append.hpp
lib/clear.hpp
lib/reopen.hpp
lib/crypt.hpp

我有问题。想象一下我的一些文件使用lib/crypt.hpp。例如在app/file.hpp 我应该写:

#include "../lib/crypt.hpp"

如果我将此文件带到lib 文件夹,它就不再起作用了。所以我需要一个类似的东西:

#include "LIB/crypt.hpp"

所以,这个 LIB/ 在 lib 目录中具有 (empty) 的含义,而在 app 目录中具有 "../lib/" 的含义。

那么我就不用担心将file.hpp 从 app 移动到 lib。我只需要修复它的调用者。但不是它所说的。

类似于网络编程框架的概念。在 C/C++ 中可以吗?

【问题讨论】:

  • 不能使用宏作为路径的一部分,但是可以制作一个扩展为完整字符串"../lib/crypt.hpp"的宏。
  • 这听起来很复杂而且没有必要,如果我理解正确的话,我只会将 lib 的父路径包含到包含目录中,然后使用 #include <lib/whatever>
  • @JoachimPileborg 任何方式都可以。我正在寻找与this code 的最后一行类似的概念。
  • @MarcoA。我的程序很容易发生很多变化,并且由于首先移动文件而修复代码很好,但过了一段时间就变得无聊了。我的代码就像你一开始说的一样。但问题是我希望每个文件都能正常工作,而不包括额外的东西。
  • 标准解决方案是使用#include "crypt.hpp"并使用选项-I../lib进行编译,或者使用#include "lib/crypt.hpp"并使用-I..进行编译。

标签: c++ c c++11 macros c-preprocessor


【解决方案1】:

根据您所写的内容,您正在寻找一种方法来移动您的源代码,而不必担心标题的硬编码路径。

您没有指定您正在使用的编译器,所以我不关注特定的编译器,无论如何大多数 C++ 编译器都有一个选项 to specify one or more header search paths(在 gcc 上,您只需使用类似 -Ilib_parent_dir 的东西)。

一旦您将 lib 的父路径包含到搜索列表中,您就可以移动源代码(只要您不移动 lib 的标头)并让它们包含正确的标头,例如 #include <lib/crypt.hpp>(和keep include paths priority in mind)

这应该是一种更清洁、更简单的方法来实现您所要求的,而不是使用宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多