宏路径中的环境变量

时间:2011-04-16 22:27:27

标签: c

我需要定义一些带宏的文件路径。如何使用$ HOME环境变量? 我无法在GNU手册中找到它,这不起作用:

#define LOGMMBOXMAN    "$HOME/mmbox/LOGmmboxman"

3 个答案:

答案 0 :(得分:5)

不,它不应该,你可能不希望在任何情况下都有这样的常量定义设置。如果你这样做并且它打算使用它,那么你的主目录将被内置为$HOME无论是谁在做建筑物。然后,可执行文件依赖于现有的特定主目录。如果没关系,只需#define你自己的家。我怀疑它不是,所以你需要在运行时推断它。

对于运行时扣除,你想要的是this,这样:

const char* home_dir = getenv("HOME");

如果没有定义$HOME,则会返回NULL,因此请务必对此进行测试。

然后您可以基于此构建您的字符串。您需要#include <stdlib.h>

答案 1 :(得分:2)

听起来你真的在问“如何从我的环境中设置一些cpp宏?”

如果你应该只能将它添加到 CPPFLAGS

export CPPFLAGS="$CPPFLAGS -D LOGMMBOXMAN=$HOME/mmbox/LOGmmboxman"

然后在你的代码中

#ifndef LOGBOXMAN
#error LOGBOXMAN not defined
#endif

然后确保使用命令行中的CPPFLAGS将源构建到gcc:

$ gcc -c file.c $CPPFLAGS

答案 2 :(得分:1)

你做不到。您需要使用构建系统来定义具有$HOME值(或非unix系统上的等效值)的宏,即类似这样的内容:

gcc -DHOME="/home/username" file.c

或者"/Users/username"适用于Mac OS X,或"C:\Users\username"(或其他内容)适用于Windows。基本上,GCC提供-D标志来在命令行上定义宏。您可以设置脚本(或构建系统)来为您处理此宏定义,或者可以创建一个依赖于系统的包含文件来正确定义HOME宏。

然后,在你的C标题中,你可以这样做:

#define LOGMMBOXMAN HOME "/mmbox/LOGmmboxman"

请注意,在C中,连续的字符串文字是连接的。所以这个宏扩展到:

"/home/username" "/mmbox/LOGmmboxman"

哪个C解释为

"/home/username/mmbox/LOGmmboxman"
编辑:所有这些想法,我没想到! D'哦!

正如其他人所指出的,你可能不想这样做。这将使您的程序硬编码为一个特定用户的主目录。如果您希望每个用户都使用您的程序,这可能会导致问题,但每个用户都要保留他(或她)自己的单独文件。

Ninefingers' answer是您最有可能寻找的。如果您发现自己需要上述技术(即将应用程序文件存储在系统特定的位置),我将保持答案不变,但我希望它对您没有帮助。