簡體   English   中英

通過函數傳遞結構時收到警告

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM