對愚蠢問題的道歉。我在stackoverflow上檢查了所有類似的問題,但它並沒有幫助我理解爲什麼這個錯誤發生在下面的代碼中。C錯誤:功能和先前聲明的衝突類型在這裏(不重複)
我有一個額外的頭文件和一個源文件,它包含在主文件中,當我編譯時,出現以下錯誤。我試圖將main()
中的char** argv
傳遞給另一個頭文件中定義的另一個函數。
#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
fr的類型om char**
至char*
並且通過argv[1]
而不是argv
。
我無言以對爲什麼發生這種情況是這樣,並根據 this similar post,我試圖在Process.h
文件中添加一個向前聲明char** path
以上extern void Process(char** path);
,但它並沒有幫助。
- 爲什麼在使用
char** path
時會拋出此錯誤? - 爲什麼在我使用
char* path
時會消失? - 到目前爲止,即使出現此警告,我也能看到程序正在運行。忽略此警告是否安全?如果不是,它可能會在運行時產生什麼影響?
使用gcc版本4.9.2(Ubuntu的4.9.2-10ubuntu13)
感謝。
也許你的編譯器不理解非標準的'#pragma once'。嘗試用'#ifndef MYPROCESS_H #define MYPROCESS_H ...#endif'替換它。 – Lundin
所有這些包括,你忘了包括'printf'的'stdio.h' :)?你用來編譯的確切命令是什麼?如果只編譯(而不是鏈接)'Process.c'(例如'cc -c Process.c'),它是否仍然會發生? – Cornstalks
謝謝@Lundin,試過了,但是這個警告沒有幫助我。 – scott