为愚蠢的问题道歉。我在stackoverflow上检查了相同错误的所有类似问题,但它没有帮助我理解为什么在以下代码中发生此错误。
我有一个额外的头文件和一个源文件,它包含在主文件中,当我编译时,我收到以下错误。我正在尝试将char** argv
从main()
传递到另一个头文件中定义的另一个函数。
#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)
感谢。
答案 0 :(得分:1)
在系统包含后尝试放置自定义包含。
自定义include可能定义了一个干扰系统包含的宏。为了最大限度地降低这种风险,我总是把Standard C包括在内,然后是任何操作系统包括,然后是第三方库,然后是我自己的那些
在理论中,自定义包不应该这样做,系统包含应该只使用保留名称,但实际上并不总是这样。