2013-10-14 65 views
-2

我在一段時間之後再次使用C進行一個項目,並試圖讓我的頭部圍繞可變參數函數。基本上,我想能夠將一些字符串傳遞給一個函數。可變參數函數中的衝突類型

#include<stdarg.h> 

int main(int argc, const char * argv[]) 
{ 

    test_function(2,"test","test2"); 
    test_function(4,"test3","test4","test5","test6"); 

    return 0; 
} 


void test_function(int args, ...) 
{ 
    va_list ap; 
    va_start(ap, args); 

    int i; 
    for(i=0;i<args;i++) 
    { 
     printf("Argument:%s\n",va_arg(ap, char*)); 
    } 

    va_end(ap); 
} 

我得到周圍test_function錯誤 - 衝突的類型「test_function」

任何人都可以點我到我的錯誤?

+2

你有沒有'test_function'的原型,編譯器在'main()'中發現時隱式聲明它爲'int test_function()'。然後遇到'void test_function(int,...)'。他們不一樣。 – WhozCraig

+0

只是想出來了!感謝Whoz! – A23

+0

爲什麼你一直使用'va_arg(ap,int)'而不是'va_arg(ap,char *)'? – glglgl

回答

8

請在使用之前申報test_function。您還需要包含stdio.h,因爲您使用的是printf

#include <stdarg.h> 
#include <stdio.h> 

void test_function(int args, ...); 

int main(int argc, char * argv[]) 
{ 
+0

謝謝俞灝。我有這個來源。 6年後回到C將是一個挑戰。我已經習慣了其他高級語言和他們的舒適。 – A23

0

要麼爲您的功能放置原型,要麼在main()之前定義它。

1

我忘了爲功能添加原型,傻我!剛剛添加

void test_function (int args, ...); 

以上的主要()和它的工作。

+0

這是對的。但是,正如其他人告訴你的那樣,這個你的激情在這裏沒有增加任何價值。反過來,你可以接受✓其他答案之一。 – glglgl

+0

我無法接受某段時間的答案。那之後我一定忘記了。 – A23

+0

那麼,可能會發生:-) – glglgl

2

正如其他人所說把原型test_function,也注意到

printf("Argument:%s\n",va_arg(ap, int)); 

您傳遞字符串給這個函數(不int S),而使用:

printf("Argument:%s\n",va_arg(ap, char *)); 
+0

我不斷調整源以隔離我的錯誤。謝謝! – A23

+0

+1用於發現未要求的錯誤。 –

+0

@餘浩,謝謝;) –