user-0 提问: 没有声明的函数为什么可以调用？

回复:
user: user-1
content: 引用 13 楼 PhycoKnight 的回复:我的就是在A中实现的，在B中直接调用，我自己写的函数，确定自己没有声明过。  你的A.B中有一个是.h文件吧,   要么就是有同名函数, 或者编译器特殊.  至少在VC系列中, 这样的条件是不可能编译通过的.

user: user-2
content: 引用 6 楼 sholber 的回复:我就不引用C标准的条款了，直接上截图，你怎么说：   大神太多，小白不好意思回复，希望回复对你有帮助   int i; 全局变量，默认为0，存放在bss段 属于弱符号，弱符号可以被引用，强符号就是存放在data段，也就是初始值非0； 强符号 强符号 强引用 报错，符号重定义 强符号 弱符号 弱引用 可行 弱符号 弱符号 弱引用 可行  还有函数也存在强弱，强弱符号之间的转换 看编译文档  如果将int i ；改为除int i= 0（全局变量int i = 0；其实和不初始化是一样的）外的初始化一定会报错；  至于 在头文件 中定义， 然后包含，编译器在编译源文件的时候经过预处理器预处理 输出源文件 将 宏处理命令解析成相对应的源代码 ,会报重定义错误 还有要看编译器怎么解析强符号与弱符号，上面的测试在gcc下面可通过,g++会报错。  关于弱定义的知识：http://www.educity.cn/wenda/308231.html

user: user-3
content: 怎么还在讨论，还没有结帖啊？？ 既然如此，朕再来说几句。 早期的编译器允许这种做法，再现在的C标准要求函数使用前必须先声明，但看在那些业已存在的大量程序的面子上，有很多编译器直到现在还容许这种做法。

user: user-4
content: 说下编译器和环境吧。 不然就会像 a+++b++a++一样，随编译器不同而结果不同。

user: user-5
content: http://goobbe.com/questions/3906779/c-global-function-not-c

user: user-0
content: 引用 15 楼 xiaohuh421 的回复:[quote=引用 13 楼 PhycoKnight 的回复:]  我的就是在A中实现的，在B中直接调用，我自己写的函数，确定自己没有声明过。  你的A.B中有一个是.h文件吧,   要么就是有同名函数, 或者编译器特殊.  至少在VC系列中, 这样的条件是不可能编译通过的.  [/quote] 我做的是嵌入式的开发，我确实没有声明，也不是.h文件，用的IAR编译的，我仔细的想了想，return后面的那个函数是调用的一个库函数，对所有的文件都是公开的，那个库函数中的两个参数都是全局，可能这个是能够调用的原因吧

user: user-3
content: 引用 8 楼 mymtom 的回复:[quote=引用 6 楼 sholber 的回复:] 我就不引用C标准的条款了，直接上截图，你怎么说：  加个编译  引用 楼主 PhycoKnight 的回复:我在文件 A.c 中定义了一个函数：  int fun(void) {         return  WM_GetDialogItem( g_hWin , ID_EDIT_0); } //其中 g_hWin 是整个工程的全局，ID_EDIT_0是A.c中的全局   然后 fun 这个函数没有声明过，但是我在 B.c 中调用的时候，直接就可以调用，为什么？ 是的，确实可以调用，但是这说明什么呢？C语言里，记住先声明后使用的原则吧。  #include <stdio.h>  int main(int argc, char *argv[]) {         double d;          d = log10(10);          printf("%f\n", d);          return 0; }  上面的程序，如果楼主有条件在AIX下运行，一定会有惊喜的。 [/quote]  以C标准文档为准。自己看吧，不费口水了。

user: user-6
content: 只要声明全局变量就默认 前面加extern（程序员可以不加，但编译器默认加上）  百度来的

user: user-7
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-1
content: 函数需要声明的情况是: 1. 函数是外部定义的, 即调用者看不到函数的实现时.   比如函数A在a.cpp中实现的, 函数B在b.cpp中实现的. 函数B要调用A,则需要先声明, 同样, A调用B也需要先声明. 2. 调用处, 函数还未实现.   比如函数A在第1行到15行.  函数B在17行到20行.  这时A调用B就需要先声明.  反过来B调用A的话, 因为A在B的前面已经实现, 所以就可以不用声明了.

user: user-8
content: 引用 6 楼 sholber 的回复:我就不引用C标准的条款了，直接上截图，你怎么说：  加个编译  引用 楼主 PhycoKnight 的回复:我在文件 A.c 中定义了一个函数：  int fun(void) {         return  WM_GetDialogItem( g_hWin , ID_EDIT_0); } //其中 g_hWin 是整个工程的全局，ID_EDIT_0是A.c中的全局   然后 fun 这个函数没有声明过，但是我在 B.c 中调用的时候，直接就可以调用，为什么？ 是的，确实可以调用，但是这说明什么呢？C语言里，记住先声明后使用的原则吧。  #include <stdio.h>  int main(int argc, char *argv[]) {         double d;          d = log10(10);          printf("%f\n", d);          return 0; }  上面的程序，如果楼主有条件在AIX下运行，一定会有惊喜的。

user: user-0
content: 引用 12 楼 PhycoKnight 的回复:[quote=引用 1 楼 sholber 的回复:] 你怎么知道它没有声明过  因为是我自己写的。。。确实没有声明[/quote]  但是如果我在函数中传入一个参数，不声明的话就报错了

user: user-0
content: 引用 9 楼 xiaohuh421 的回复:函数需要声明的情况是: 1. 函数是外部定义的, 即调用者看不到函数的实现时.   比如函数A在a.cpp中实现的, 函数B在b.cpp中实现的. 函数B要调用A,则需要先声明, 同样, A调用B也需要先声明. 2. 调用处, 函数还未实现.   比如函数A在第1行到15行.  函数B在17行到20行.  这时A调用B就需要先声明.  反过来B调用A的话, 因为A在B的前面已经实现, 所以就可以不用声明了.  我的就是在A中实现的，在B中直接调用，我自己写的函数，确定自己没有声明过。

user: user-0
content: 引用 1 楼 sholber 的回复:你怎么知道它没有声明过  因为是我自己写的。。。确实没有声明

user: user-3
content: 我就不引用C标准的条款了，直接上截图，你怎么说：

user: user-9
content: 引用 3 楼 sholber 的回复:[quote=引用 2 楼 zhangxiangDavaid 的回复:] 在c语言中全局的函数和变量是对每个文件可见的，但在别的文件中变量需要用extern声明，才可用；而函数不需要 什么叫全局的？ 在A文件中声明的函数，若单独编译的话，能在B文件中看见？？ 我在A文件中有如下声明： int i = 0; 我在B文件中非得用 extern int i; 用 int i; 就不行？你肯定？？[/quote] 函数不需extern声明，即可在其他的文件可用，而变量必须用extern声明才可用。

user: user-10
content: 因为C语言当年的垃圾规定。

user: user-3
content: 引用 2 楼 zhangxiangDavaid 的回复:在c语言中全局的函数和变量是对每个文件可见的，但在别的文件中变量需要用extern声明，才可用；而函数不需要 什么叫全局的？ 在A文件中声明的函数，若单独编译的话，能在B文件中看见？？ 我在A文件中有如下声明： int i = 0; 我在B文件中非得用 extern int i; 用 int i; 就不行？你肯定？？

user: user-9
content: 在c语言中全局的函数和变量是对每个文件可见的，但在别的文件中变量需要用extern声明，才可用；而函数不需要

user: user-3
content: 你怎么知道它没有声明过