隐式声明函数'execle'错误

时间:2015-07-10 15:28:17

标签: c c99

我一直在

  

函数'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;
}

4 个答案:

答案 0 :(得分:4)

C99中,不允许使用隐式声明函数。这意味着,编译器在遇到对该函数的调用之前应该知道函数签名。这可以通过两种方式实现

  1. 使用前定义功能。
  2. 提供函数的前向声明并稍后定义。
  3. 通常,函数签名是通过头文件提供的前向声明。

    根据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将环境变量传递给被调用程序。