我想知道当包含或包含的引用包含在同一目录中时,仅作为软链接会发生什么。
想象一下三个标题,a
,b
和c
以及目录d
。 a
和b
在CWD中,c
在d
下。现在假设d
下的软链接指向b
(名为b
)。
如果仅使用引用包含且c
包含b
包括a
,a
将在目录d
中搜索b
,这是位置到b
的软链接,或CWD中string folder = @"C:/Aatrox";
private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
var fileName = (string)ListBox1.SelectedItem;
textEditorControl1.Text = File.ReadAllText(Paht.Combine(folder, fileName));
}
private void FlatButton3_Click(object sender, EventArgs e)
{
ListBox1.Items.Clear();
string[] txtfiles = Directory.GetFiles(folder, "*.txt");
string[] luafiles = Directory.GetFiles(folder, "*.lua");
foreach (var item in txtfiles)
{
ListBox1.Items.Add(Path.GetFileName(item));
}
foreach (var item in luafiles)
{
ListBox1.Items.Add(Path.GetFileName(item));
}
}
的实际物理位置?
我读过a page at MSDN,但我找不到明确的答案。 “与包含#include语句的文件相同的目录”是什么意思?
答案 0 :(得分:2)
将文件搜索到#include
("file"
或<file>
:[cpp.include] / 2-3)的过程是实现定义的(除非前者在失败时退回后者),这意味着必须由编译器供应商决定并记录。所以它几乎是“它如何在[你的]计算机上运行”,尽管有一些共同的惯例。我希望同一目录搜索在包含符号链接的目录中,因为必须采取积极的行动。
答案 1 :(得分:1)
解决软链接的机制不考虑当前的工作目录,而是考虑链接的目录。让我演示一个更自然的例子,如果你试着阅读/usr/include/X11/Xlib.h
(例如,这是编译器在linux中搜索<X11/Xlib.h>
的地方之一),它会发生{ {1}}是/usr/include/X11
的软链接,算法在解决所有路径组件后最终解析为../../opt/X11/include
(或实际上/usr/include/../../opt/X11/include
,与当前目录无关。当前或根目录是在您的u区域(专用于您的进程的操作系统资源的一部分)中保留的inode表条目,以便启动机制或将名称解析为inode条目任务,最终处理到inode您要打开的文件。这对编译器来说是透明的,所以尽管有人说它是实现定义的,但所有posix系统都有一个简单的机制来搜索最终文件的系统相关目录列表。但是,软链接机制是透明的,您不需要期望特殊的编译器行为。
编译器只考虑其当前工作目录的唯一时间是,如果您实际强制它执行,如:
/opt/X11/include
或
#include "./header.h"
如果软链接指向文件(而不是目录),则显示此示例:
假设您的安装已将ncurses包含在#include "../../includes/myprojectheader.h"
中的一个子目录中(假设为ncurses
),并且您想使用/usr/include
,那么您已安排以下内容:
#include <ncurses.h>
您将拥有指向ln -s ncurses/curses.h curses.h
的文件/usr/include/curses.h
的链接,然后当您打开ncurses/curses.h
内核到达路径的最后一部分时/usr/include/curses.h
)并且看到它是一个符号链接,因此它替换最后一部分(因为指向的链接不是绝对的)并用curses.h
替换它,并打开文件ncurses/curses.h
。