我一直在
函数'execle'的隐式声明在C99中无效
编译下面的代码时。我错过了什么?
#include <stdio.h>
#include <stdlib.h>
char *my_env[] = {"JUICE=PEACH and apple", NULL};
int main (int argc, char *argv[])
{
execle ("diner_info", "diner_info", "4", NULL, my_env);
printf ("Diners: %s\n", argv[1]);
printf ("Juice: %s\n", getenv("JUICE"));
return 0;
}
答案 0 :(得分:4)
在C99
中,不允许使用隐式声明函数。这意味着,编译器在遇到对该函数的调用之前应该知道函数签名。这可以通过两种方式实现
通常,函数签名是通过头文件提供的前向声明。
根据execle()
的{{3}},您需要包含unistd.h
才能获得转发声明。
答案 1 :(得分:3)
您需要包含 unistd.h 来解决隐式的dec警告
答案 2 :(得分:1)
我得到了它的工作。事实证明这就是陈述的顺序。在execle之后的任何东西都不会运行。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char *my_env[] = {"JUICE=PEACH and apple", NULL};
int main (int argc, char *argv[])
{
printf ("Diners: %s\n", argv[1]);
printf ("Juice: %s\n", getenv("JUICE"));
execle ("diner_info", "diner_info", "4", NULL, my_env);
return 0;
}
结果:
# :$ gcc diner_info.c -o diner_info && ./diner_info
Diners: (null)
Juice: (null)
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
但我仍然不明白为什么顶部的空值。
答案 3 :(得分:1)
我认为您可能全都错了,以防万一其他人遇到了这个问题,我正在提交。我也正在阅读第一本C语言书籍,并阅读了本节内容。我认为您需要两个程序,一个应命名为“ dinner_info”
//dinner_info.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
printf("Dinners: %s\n", argv[1]);
printf("Juice: %s\n",getenv("JUICE"));
return 0;
}
另一个应该是您的驱动程序,例如my_exec_program,您需要在其中包含标题unistd.h,因为您将调用execle
函数
//my_exec_program
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main (int argc, char* argv[])
{
char * my_env[] = {"JUICE=peach and apple", NULL};
execle("dinner_info", "dinner_info", "4" , NULL , my_env);
}
请特别注意如何设置JUICE环境变量,在JUICE,等号和桃子之间不应有空格。由于这一遗漏,我一直在获取JUICE的空值。
所以这里发生了什么,您正在调用一个程序,该程序又调用另一个程序,并使用功能execle
将环境变量传递给被调用程序。