C 语言中的函数顺序

  • 本文关键字:函数 顺序 语言 c
  • 更新时间 :
  • 英文 :


为什么我的代码有效?我在声明函数 generateNumber 之前调用它,并且我没有在文件开头设置原型,所以通常它不应该工作,不是吗?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, const char * argv[]) {
    int max = 100;
    int min = 1;
    int mysteryNumber = generateNumber(min, max);
    int enteredNumber = min-1;
    do{
        printf("Enter a number !n");
        scanf("%d", &enteredNumber);
        if (enteredNumber > mysteryNumber) {
            printf("It's less !");
        }else if(enteredNumber < mysteryNumber){
            printf("It's more !");
        }
    }while (enteredNumber != mysteryNumber);
    printf("Congratulations, the mystery number was %d n", mysteryNumber);
    return 0;
}
int generateNumber(int min, int max){
    srand(time(NULL));
    return (rand() % (max - min + 1)) + min;
}

提前感谢!

令人惊讶的是,这是它实际上应该与旧编译器一起使用的罕见情况之一 - 特别是与 C99 之前的编译器一起使用。不过,你不应该这样做:隐式int已经在 C99 中删除了,因为它使代码变得脆弱。

当函数缺少原型时,较旧的 C 编译器过去会假定其所有参数都与您传递的表达式类型匹配,并且它们的返回类型为 int 。你的函数恰好符合这个描述:你传递两个整数,并将返回值视为int

你是对的,它不应该起作用。我的 gcc (6.1.0) 产生:

test.c: In function ‘main’:
test.c:9:25: warning: implicit declaration of function ‘generateNumber’ [-Wimplicit-function-declaration]
     int mysteryNumber = generateNumber(min, max);
                         ^~~~~~~~~~~~~~

它之所以"有效",是因为大多数编译器通过提供隐式函数声明来允许这样做。但是,它在现代 C 中无效。

在 C99 从标准中删除此隐式函数声明之前,它是允许的。但自 C99 以来,它不再有效。如果编译器未为此提供警告,请尝试提高警告级别。

最新更新