C错误:函数和先前声明的冲突类型在这里(不重复)

时间:2016-10-20 12:12:10

标签: c arrays function

为愚蠢的问题道歉。我在stackoverflow上检查了相同错误的所有类似问题,但它没有帮助我理解为什么在以下代码中发生此错误。

我有一个额外的头文件和一个源文件,它包含在主文件中,当我编译时,我收到以下错误。我正在尝试将char** argvmain()传递到另一个头文件中定义的另一个函数。

#include "include/Process.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc < 2) {
    printf("Please provide a path to file\n");
    return (EXIT_FAILURE);
}
Process(argv);

Process.h:

#pragma once
extern void Process(char** path);

Process.c:

#include <stdio.h>
#include "../include/Process.h"
#include <stdlib.h>
#include <sys/stat.h>
#include <syslog.h>
#include <sys/types.h>
#include <unistd.h>
void Process(char** path) {
    printf("%s\n", path[1]);
}

它被编译但是警告是

./src/Process.c:22:6: error: conflicting types for ‘Process’
 void Process(char** path) {
      ^
./include/Process.h:17:6: note: previous declaration of ‘Process’ was here
 extern void Process(char** path);
  ^

但是,当我将path的类型从char**更改为char*并传递argv[1]而不是argv时,警告消失。

我无能为力,为什么会发生这种情况,并且根据 this similar post,我尝试在char** path文件中为extern void Process(char** path);上方Process.h添加前瞻性声明,但它也没有帮助。

  • 使用char** path
  • 时,为什么会抛出此错误
  • 当我使用char* path时,为什么它会消失?
  • 到目前为止,即使有这个警告,我也可以看到程序正在运行。忽略这个警告是否安全?如果没有,它可能会在运行时产生什么影响?

使用gcc版本4.9.2(Ubuntu 4.9.2-10ubuntu13)

感谢。

1 个答案:

答案 0 :(得分:1)

在系统包含后尝试放置自定义包含。

自定义include可能定义了一个干扰系统包含的宏。为了最大限度地降低这种风险,我总是把Standard C包括在内,然后是任何操作系统包括,然后是第三方库,然后是我自己的那些

理论中,自定义包不应该这样做,系统包含应该只使用保留名称,但实际上并不总是这样。