是否可以像下面的参数一样制作命令?
./exe FROM_FILE=true
在这种情况下,我对程序的期望是,当 FROM_FILE 值为 true 时,我将从文件中获取数据,如果为 false,我可以获取标准值。我为此目的找到的其他替代方法是使用
- -选项
- 只需传递参数。但在这种情况下,我不得不担心参数的顺序。
这个是在做makefile时才想到的。
$>cat 生成文件 可执行程序 : 回声 ${FROM_FILE} $> 使 FROM_FILE=true 回声真 真的 $>
是否可以像下面的参数一样制作命令?
./exe FROM_FILE=true
在这种情况下,我对程序的期望是,当 FROM_FILE 值为 true 时,我将从文件中获取数据,如果为 false,我可以获取标准值。我为此目的找到的其他替代方法是使用
这个是在做makefile时才想到的。
$>cat 生成文件 可执行程序 : 回声 ${FROM_FILE} $> 使 FROM_FILE=true 回声真 真的 $>
你可以做
FROM_FILE=true ./exe
然后使用environ
指针或. 从应用程序内部读取 FROM_FILE 环境变量getenv()
。见http://linux.die.net/man/7/environ
当然有可能!像这样的东西(未经测试):
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");
}
编辑:我想得越多,它似乎就越不符合常见的命令行界面约定。也许你应该读这个: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)
可能的?好吧,既然 make 显然做到了(我自己没有尝试过),这显然是可能的。不过,它可能会让一些人感到困惑,因为它肯定是一种不寻常的语法。
那么你想要做的可能是迭代argv[]
,在表单上找到任何参数something=something
,然后施展你的魔法。甚至可能在你完成它们之后将它们归零,然后做一些更正常的事情,比如将繁重的工作交给getopt
或类似的库。
需要考虑的一件事,特别是如果您希望它是通用的,那么当有人将文件名传递给您的应用程序时该怎么=
办.