对于使用extern关键字对作用域的影响

当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需再为它另外开辟存储单元。这时其作用域从extern说明处起,延伸到该函数末尾。
就是说在另一个文件中使用这个关键字,这个已经定义过的全局变量在这个文件中的作用域就是从关键字的位置开始
例如

// 文件1

int addNumbers(int a, int b) {
    return a + b;
}

// 文件2

#include <stdio.h>

// 声明自定义函数
extern int addNumbers(int a, int b);
void printResult(int result);

int main() {
    int result = addNumbers(3, 5); // 调用自定义函数
    printResult(result); // 调用自定义函数打印结果
    return 0;
}

void printResult(int result) {
    printf("Result: %d\n", result);
}

如果将extern int addNumbers(int a, int b);放在自定义函数printResult后面进行声明,产生的结果就会跟上面正确的代码段不一样对吗

extern表示函数在其它地方定义过,这行表示声明函数,从声明处开始到该文件结尾都有效,若你把声明放在最后,那声明的前面肯定无法使用了啊,懂了么?
这里说的是顶层声明

函数的本质其实就是一个指向函数入口的指针变量
所以它的行为和extern定义变量应该是一样的,也就是当前变量隐藏extern变量。无论你写在前面还是后面,都是你当前程序定义的printResult有效。

【以下回答由 GPT 生成】

在这种情况下,代码是可以成功编译和运行的。因为函数addNumbers已在文件1中定义,文件2中使用extern关键字进行了声明,通知编译器这个函数是在其他文件中定义的。在文件2中,addNumbers函数被正确调用,并传递给printResult函数打印结果。因此,该情况不会产生错误结果。

然而,编写代码时,通常会将声明放在定义之前,以便代码更容易阅读和理解。在实际项目中,最佳实践是将函数声明放在定义之前或者将两者分离到不同的头文件中。这样可以提高代码的可读性和可维护性。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^