2016-10-20 38 views
7

對愚蠢問題的道歉。我在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)

感謝。

+2

也許你的編譯器不理解非標準的'#pragma once'。嘗試用'#ifndef MYPROCESS_H #define MYPROCESS_H ...#endif'替換它。 – Lundin

+2

所有這些包括,你忘了包括'printf'的'stdio.h' :)?你用來編譯的確切命令是什麼?如果只編譯(而不是鏈接)'Process.c'(例如'cc -c Process.c'),它是否仍然會發生? – Cornstalks

+0

謝謝@Lundin,試過了,但是這個警告沒有幫助我。 – scott

回答

1

嘗試把您的自定義包括在系統後。

定製包含可能會定義一個干擾系統的宏。爲了儘量減少這種風險,我公司始終把標準C包括第一,那麼任何操作系統包括,然後第三方庫,然後我自己的那些

理論定製包括不應該這樣做,該系統應該只使用保留名稱,但實際上並不總是如此。

相關問題