2

是否可以像下面的参数一样制作命令?

./exe FROM_FILE=true 

在这种情况下,我对程序的期望是,当 FROM_FILE 值为 true 时,我将从文件中获取数据,如果为 false,我可以获取标准值。我为此目的找到的其他替代方法是使用

  1. -选项
  2. 只需传递参数。但在这种情况下,我不得不担心参数的顺序。

这个是在做makefile时才想到的。

$>cat 生成文件
可执行程序 :
        回声 ${FROM_FILE}
$> 使 FROM_FILE=true
回声真
真的
$>
4

4 回答 4

5

你可以做

FROM_FILE=true ./exe

然后使用environ指针或. 从应用程序内部读取 FROM_FILE 环境变量getenv()。见http://linux.die.net/man/7/environ

于 2013-07-17T07:56:38.757 回答
0

当然有可能!像这样的东西(未经测试):

int main(int argc, char **argv)
{
    int FROM_FILE = 0;
    const char *FROM_FILE_key = "FROM_FILE";
    int i;
    /* Iterate through all the arguments. */
    for (i = 1; i < argc; ++i)
    {
        /* Look for the '='. If not there, skip this argument. */
        char *eq = strchr(argv[i], '=');
        if (!eq)
            continue;

        /* Compare the key. If not what we want, skip it. */
        if (strncmp(argv[i], FROM_FILE_key, strlen(FROM_FILE_key)) != 0)
            continue;

        /* Parse the value. You probably want to make this more flexible 
          (true, 1, yes, y...)*/
        if (strcmp(eq+1, "true") == 0)
            FROM_FILE = 1;
    }

    printf("FROM_FILE=%s", FROM_FILE? "true" : "false");
}
于 2013-07-17T08:02:33.343 回答
0

编辑:我想得越多,它似乎就越不符合常见的命令行界面约定。也许你应该读这个:http ://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html

你试过环境变量吗?

你可以做

FROM_FILE=true ./exe

在 exe.c 中:

[...]
char *file = getenv("FROM_FILE");
if (file == NULL)
  *file = DEFAULT;
[...]

或者,对于命令行界面的更 GNU-ish 方法,请查看 getopt 或 argp。(http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html#Parsing-Program-Arguments

于 2013-07-17T07:57:05.527 回答
0

可能的?好吧,既然 make 显然做到了(我自己没有尝试过),这显然是可能的。不过,它可能会让一些人感到困惑,因为它肯定是一种不寻常的语法。

那么你想要做的可能是迭代argv[],在表单上找到任何参数something=something,然后施展你的魔法。甚至可能在你完成它们之后将它们归零,然后做一些更正常的事情,比如将繁重的工作交给getopt或类似的库。

需要考虑的一件事,特别是如果您希望它是通用的,那么当有人将文件名传递给您的应用程序时该怎么=办.

于 2013-07-17T08:00:40.393 回答