我有以下代码片段,其中存储了一个宏,其中包含我正在编写的一个编辑器的配置文件路径.

#ifdef _WIN32 
#define CONFIG_FILE_PATH /* windows path here */
#else
#define CONFIG_FILE_PATH "~/.stupid_editor_rc"
#endif

在Unix系统中,是否有一个相当于~的Windows,或者是否有一种方法可以在C宏中安装一个函数来确定Windows主目录?

推荐答案

在Unix系统中是否有一个相当于~的Windows,

据我所知没有.

不管怎样,这可能是个错误的问题. 您所考虑的~的使用是shell的一个功能,而不是底层操作系统.系统本身在Unix上不像在Windows上那样执行波浪扩展.

或者,有没有一种方法可以在像这样的C宏中适合一个确定Windows主目录的函数?

假设您希望程序 Select 运行它的用户的配置文件,而不是构建它的用户,您try 的方法在Windows或Unix上都不起作用,但有其他 Select .(即使你想要构建器的配置文件,你也需要以不同的方式设置宏的值.

在Unix上,人们可能会在运行时根据环境变量HOME的值动态地构造所需的路径. 它可以通过getenv()函数读取,所以总体上是这样的:

    const char config_name[] = ".stupid_editor_rc";
    const char *home_path = getenv("HOME");
    // check for and handle environment variable not defined ...

    char *config_path = malloc(strlen(home_path) + sizeof config_name + 1);
    // check for and handle handle allocation failure ...

    sprintf(config_path, "%s/%s", home_path, config_name);
    FILE *config_file = fopen(config_path);
    // check for and handle fopen failure ...

    free(config_path);
    // ...

您应该能够通过使用适当的Windows环境变量在Windows中执行类似的操作. 没有一个精确的类似功能,但UserProfile是相当接近的. 如果您不必处理网络共享上的主目录,那么您可能不必担心差异.

宏化以便在编译时自动 Select 适当的变量留作练习.

C++相关问答推荐

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

为什么这个select()会阻止?

GCC:try 使用—WError或—pedantic using pragmas

为什么I2C会发送错误的数据?

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

在传统操作系统上可以在虚拟0x0写入吗?

当我更改编译优化时,相同的C代码以不同的方式运行

使用双指针动态分配和初始化2D数组

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

S的这种管道实施有什么问题吗?

这个计算C中阶乘的函数正确吗?

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

我在反转双向链表时遇到问题

Valgrind用net_pton()抱怨

&stdbool.h&q;在嵌入式系统中的使用

计算时出现奇怪的计算错误;N Select K;在C中

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?