[英]Getting a warning when passing struct through function
我試圖通過一個函數按值傳遞整個結構,並通過顯示傳遞的結構中的變量來測試傳遞是否成功。
當我編譯並運行程序時,變量顯示正確,但我收到警告:
警告:函數聲明中的參數名稱(無類型)
所以它指的是使用沒有類型的參數名稱聲明的函數原型? 但是,如果我正確聲明了該函數,為什么會收到此警告?
此外,在我編寫的用於測試的短程序中,警告不會影響顯示輸出正確的事實。
但是,如果我在編寫大型程序時在相同情況下(通過函數傳遞結構)收到此警告,是否會影響該程序中的輸出正確?
我的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void pass(Info);
typedef struct {
char str[10];
int num;
} Info;
void main() {
Info i;
strcpy(i.str, "Hello!");
i.num = 1;
pass(i);
}
void pass(Info i) {
printf("%s\n", i.str);
printf("%d\n", i.num);
}
輸出:
你好!
1
在使用新定義的類型(另一種類型的同義詞,是 nitpicky )之后,您有typedef
語句。 此時,在函數前向聲明中,編譯器不知道名為Info
的類型。 因此,它假定它是一個變量名。
將typedef
函數原型之前。
也就是說, void main()
main()
在托管環境中不是void main()
的有效簽名。 至少應該是int main(void)
。
因為您在 Info 結構聲明之前聲明了函數原型。
另一種可能是以下代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char str[10];
int num;
} Info;
void pass(Info);
void main()
{
Info i;
strcpy(i.str, "Hello!");
i.num = 1;
pass(i)
}
void pass(Info i)
{
printf("%s\n", i.str);
printf("%d\n", i.num);
}
編譯器認為這個函數聲明
void pass(Info);
作為帶有標識符列表的函數聲明。 那就是這里的Info
是參數的標識符而不是它的類型。
但是根據 C 標准(6.7.6.3 函數聲明符(包括原型)):
3 函數聲明符中不屬於該函數定義的標識符列表應為空。
因此,編譯器發出警告,指出對於不是函數定義的函數聲明,標識符列表不為空。
warning: parameter names (without types) in function declaration
要么你應該寫
void pass();
或者您應該將結構聲明的 typedef 放在函數聲明之前,在這種情況下,名稱Info
將表示一個類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.