68968


C言語でカレントディレクトリを取得する方法が分からなくて困ってます。  
環境は、Windows10、Visual Studio 2017です。

調べたところ、C言語だとgetcwd関数でカレントディレクトリを取得することができるとわかりました。  
しかし、そのためにはuninsd.hをインクルードする必要があると参考のサイトを読むと書かれてありましたが、Visual
Studioを使った環境だとuninsd.hをインクルードすることができませんでした。

以下のサイトの170票ほど入っているソースをuninsd.hとしてコピペしてuninsd.hをVisual Studio
2017にインクルードしようとしてますが、#include <getopt.h>の箇所で、「ソースファイルが開けません。」というエラーが出てました。

170票ほど入っているソースがある参考サイト：  
<https://stackoverflow.com/questions/341817/is-there-a-replacement-for-unistd-
h-for-windows-visual-c/826027#826027>

上記エラー解決のため、以下のサイトのgetopt.cとgetopt.hをコピペしてそれぞれファイルを作成しましたが、  
getopt.c の# include
<strings.h>でソースファイルが開けません。」というエラーが出ており、これをどうやってインクルードするのかわかりませんでした。

getopt.cとgetopt.hをコピペ元サイト：  
<https://gist.github.com/ashelly/7776712>

どうすればC言語でカレントディレクトリを取得できるのか教えて頂けるとありがたいです。  
どうかよろしくお願いいたします。


CC BY-SA 4.0
2020-07-26T01:17:54.027
68966
2020-08-12T23:22:36.113
2020-07-26T04:26:33.193
21034
21034
question
c visual-studio
C言語でカレントディレクトリを取得する方法がわからない


Unixとのソースコード互換を達成したいなら `unistd.h` 相当のものが必要かもしれませんが、そういう目的でないなら、`unistd.h`
を用意するというのは意味の薄い解決方法です。

Visual Studio では、`#include <direct.h>`
して、[_getcwd()](https://docs.microsoft.com/ja-jp/cpp/c-runtime-
library/reference/getcwd-wgetcwd?view=vs-2019) を使うのが最も簡単な方法です。


CC BY-SA 4.0
2020-07-26T01:28:57.927
68967
2020-07-26T01:28:57.927
3475
68966
answer


質問文には`getcmd`（cmd; command?）とありますが`getcwd`（cwd; current working
directory）の誤りではありませんか？

[Visual Studio 2005以降](https://docs.microsoft.com/ja-jp/cpp/porting/visual-
cpp-what-s-new-2003-through-2015?view=vs-2019#new-crt-features)、

>   * POSIX 名が非推奨とされ、ISO C++ に準拠する名前が使われるようになりました (たとえば、getch ではなく _getch
> を使います)。
>

となっており[`getcwd`](https://docs.microsoft.com/ja-jp/cpp/c-runtime-
library/reference/getcwd?view=vs-2019)ではなく[`_getcwd`](https://docs.microsoft.com/ja-
jp/cpp/c-runtime-library/reference/getcwd-
wgetcwd?view=vs-2019)を使うことになっています。しかし引き続き`getcwd`も互換のために残されており、現在でも使用可能です。ただし、

[code]

    warning C4996: 'getcwd': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getcwd. See online help for details.
    
[/code]

という警告が表示されます。加えて、Visual Studio上で新規にプロジェクトを作成すると[コンパイルオプション/sdl (追加のセキュリティ
チェックの有効化)](https://docs.microsoft.com/ja-jp/cpp/build/reference/sdl-enable-
additional-security-checks?view=vs-2019)が指定されているため、警告でなくエラーとなってしまいます。  
いずれにしても[C4996のヘルプ](https://docs.microsoft.com/ja-jp/cpp/error-
messages/compiler-warnings/compiler-warning-level-3-c4996?view=vs-2019#posix-
function-
names)にコンパイルオプション`/D_CRT_NONSTDC_NO_WARNINGS`もしくはマクロ`_CRT_NONSTDC_NO_WARNINGS`を指定すればコンパイルできるとあります。

~~が、今試してみると **バグっていてコンパイルできません**
ね…。おとなしく、`getcwd`のドキュメントで紹介されているように[`_getcwd`](https://docs.microsoft.com/ja-
jp/cpp/c-runtime-library/reference/getcwd-
wgetcwd?view=vs-2019)を使用することをお勧めします。~~

確認手段を誤っていました。現在でも`getcwd`は利用可能です。[コンパイルオプション`/Za`言語拡張機能の無効化](https://docs.microsoft.com/ja-
jp/cpp/build/reference/za-ze-disable-language-
extensions?view=vs-2019)を付けているとコンパイルできなくなるようです。


CC BY-SA 4.0
2020-07-26T01:54:46.453
68968
2020-08-12T23:22:36.113
2020-08-12T23:22:36.113
4236
4236
68966
answer