簡體   English   中英

VS2013 C99 —為什么要編譯?

[英]VS2013 C99 — Why Does This Compile?

有人可以告訴我為什么下面的代碼編譯(請參見下面的getchar)嗎? 我已經有一段時間沒有寫C了,但是我很確定getchar行不應該編譯它。 剛剛安裝了以/ Za + / Wall作為C編譯的VS2013 Pro。正在尋找C99兼容性。

int count_lines(void) {
    char c;
    int num_of_lines = 0;

    while ((c = getchar) != EOF)      // compiles as getchar instead of getchar()
        if (c == '\n') ++num_of_lines;

    return num_of_lines;
}

這個:

c = getchar

嘗試將函數getchar的地址分配給char對象c

這是違反約束的情況 ,這意味着任何符合標准的C編譯器都必須發出診斷信息。 從法律上來說,該診斷可能是非致命的警告,盡管標准未定義其行為,但仍允許編譯器生成“工作中”的可執行文件。

如果編譯器沒有完全拒絕它,則它很可能會生成函數指針值到char類型的轉換。 該標准未定義這種轉換的行為(但是很可能會占用地址的低8位。這不太可能與EOF的值匹配,從而導致無限循環。)

我確定你知道

while ((c = getchar) != EOF)

應該

while ((c = getchar()) != EOF)

您可能沒有注意到, getchar()函數精確地返回類型為int而不是char ,以便可以將EOF值與任何有效字符值區分開。 您應該將c聲明為int ,而不是char 請參閱comp.lang.c FAQ的問題12.1。

我確定您為此收到了編譯器警告。 但這是編譯的,因為您正在做的就是將c設置為函數getchar的地址(當然,您只會得到該地址的最低字節)。

您不只是將getchar函數的地址值分配給c嗎? 這可能不是您想要的,但不是非法的。

gcc -g -o test test.c
test.c: In function ‘count_lines’:
test.c:7:15: warning: assignment makes integer from pointer without a cast [enabled by   default]
     while ((c = getchar) != EOF)      // compiles as getchar instead of getchar()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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