gpt4 book ai didi

C++ 单独包含和源目录和#Include

转载 作者:行者123 更新时间:2023-11-30 04:01:24 25 4
gpt4 key购买 nike

目前在我的应用程序中我只有一个源代码树

MyApp/Source
|-Precompiled.hpp
|-Precompiled.cpp
|-Thing.hpp
|-Thing.cpp
|-Main.cpp
|-Component
| |-ComponentThing.hpp
| |-ComponentThing.cpp
| |-...
|-ComponentB
| |-ComponentBThing.hpp
| |-...
|-PluginCandiate
| |-PluginThing.hpp
| |-PluginThing.cpp
| |-...
...

但是我想制作一个插件系统(这样更少的东西是核心应用程序的一部分,边界清晰),所以我想将许多 .hpp 文件移动到一个单独的 Include\MyApp 树中。所以新树可能看起来像:

MyApp/Include/MyApp
|-Thing.hpp
|-Component
| |-ComponentThing.hpp
| ...
|-ComponentB
| |-ComponentBThing.hpp

MyApp/Source
|-Precompiled.hpp
|-Precompiled.cpp
|-PrivateThing.hpp
|-PrivateThing.cpp
|-Component
| |-ComponentThing.cpp
| |-...
|-ComponentB
| |-...
...

Plugins/PluginCandiate/Source
|-PluginThing.hpp
|-PluginThing.cpp
...

现在使用当前方式,我的包含路径中只有“Source”。这意味着例如在 ComponentThing.cpp 中我可以说:

#include "Precompiled.hpp"
#include "ComponentThing.hpp"
#include "ComponentOtherThing.hpp"
#include "ComponentB/ComponentBThing.hpp"

因为当前目录总是位于包含路径的第一位。但是,如果我拆分我的公共(public)包含目录和源目录,情况就不再是这样了。我可以将 Include/Myapp/放在包含路径上,但我仍然需要所有内容的完整组件路径。

有没有一种简单的方法可以避免这种情况(使用 MSVC MSBuild 和 Linux make 文件),或者只使用完整的#includes 是标准做法吗?还是人们通常会做一些其他事情(例如,我考虑过一个构建后步骤来从主源代码树中“导出”列出的公共(public) header 集)?

最佳答案

是的。您只需将路径添加到新的包含文件夹,然后只需添加 #include "filename.h"另一种方法是在包含路径中包含路径的相对路径。

例如如果您有以下目录树:

+ MyApp
- file.c
- file.h
+ Plugins
+ Include
- pluginheader.h

file.c 中的任何 #include 都可以是相对的:

#include "Plugins/Include/pluginheader.h"  

或者您可以将 ./Plugins/Include 添加到您的包含路径并使用

#include "pluginheader.h"  

(您不必指定完整路径,只需指定工作目录的相对路径)

编辑:这是您可以轻松尝试的事情之一,我认为这是您根据评论提出的问题:

./file.c:

#include <stdio.h>
#include "module/function.h"
int main()
{
int sum;
myStruct orange;
myStruct_insert(&orange, 5, 6);
sum = myStruct_sum(&orange);
printf("%d",sum);
return 0;
}

./module/function.h:

typedef struct{
int one;
int two;
}myStruct;

void myStruct_insert(myStruct *apple, int one, int two);

int myStruct_sum(myStruct *apple);

./module/function.c:

#include "function.h"
void myStruct_insert(myStruct *apple, int one, int two)
{
(*apple).one = one;
(*apple).two = two;
}

int myStruct_sum(myStruct *apple)
{
return (*apple).one+(*apple).two;
}

我用 gcc file.c ./module/function.c 编译了这个(没有添加包含路径)。它编译没有错误并正确执行:

$ gcc file1.c module/function.c
$ ./a
11
$

所以您的问题的答案是肯定的,它将在与编译器当前正在处理的代码相同的文件夹中包含 header 。或者至少它适用于 GCC。 MSVC 等可能有不同的行为。

但是最好明确指定。它更冗长但不太容易与名称相似的头文件混淆。

关于C++ 单独包含和源目录和#Include,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25781234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com