在c语言中,碰到一个.c文件,无.h头文件,在另一.c文件调用函数时,并没有进行声明extern,

此时编译器不会报错,会默认去查找同名的函数,这样会存在一些问题,查了些资料,稍微总结了下:

总结:

1.声明函数可以不加extern,函数默认extern。
2.声明变量必须要加extern.
3.如果不加extern,编译器会默认去查找同函数名的函数,但会出错。
  1).参数中如果出现float,一定会出现读取错误,但编译运行不报错.如果形参float后有int*类型的变量,编译运行会报错,之前有则不会报错。
  2).函数形参如果都是整数类型的值(char、short、int、long、long long等),都可以正常传值,值的大小可以大于int范围
  3).函数返回值无所谓什么类型,但大小范围不能超过int型范围(-2147483648 ~ +2147483647),超过会返回值错误.
    可以理解为:默认返回值为int,后被强转成需要返回的类型(long、float等).

main.c

#include<stdio.h>
//extern int test_1(int a);
//int test_2(int a, int b);
//...
int main()
{
int a0 = ;
int a[] = { };
int*b = a;
float c = 0.01f;
char d = ;
long long e = ;
long long f = ; int a1 = test_1(a0); //
int a2 = test_2(a0, a0 + );//
float a3 = test_3(a0, a0 + );//3.00
float a4 = test_4(a0, c);// -85899342, c在那边读取2.000,
int a5 = test_5(a0, c); // 3, c在那边读取2.000,
int a6 = test_6(a0, c, a0 + );// 1065646818, c在那边读取2.000, a0+1读为:1065646817
int a7 = test_7(a0, d); //
int a8 = test_8(a0, b); //3, b[1]正常写入8
int a9 = test_9(a0, b, c);//3, c在那边读取2.000,b[1]正常写入10
//int a10 = test_10(a0, c, b);//报错,c读取为2.00,b报内存冲突
long long a11 = test_11(a0, e);//2147483647, e在那边正常读为2147483648,说明形参超出int读取正常
long long a12 = test_11(a0, f);//-2147483648, f在那边正常读为2147483649,说明返回值超出int会读取出错 getchar();
}

test.c

int test_1(int a)
{
return a + ;
}
int test_2(int a, int b)
{
return a + b;
}
float test_3(int a, int b)
{
return a + b;
}
float test_4(int a, float b)
{
float c = a + b;
return c;
}
int test_5(int a, float b)
{
int c = a + b;
return c;
}
int test_6(int a, float b, int c)
{
int d = a + c;
return d;
}
int test_7(int a, char b)
{
int c = a + b;
return c;
}
int test_8(int a, int* c)
{
c[] = ;
return a + ;
}
int test_9(int a, int* c, float b)
{
c[] = ;
return a + ;
}
int test_10(int a, float b, int* c)
{
c[] = ;
return a + ;
} long long test_11(int a, long long b)
{
long long c = b-;
return c;
}

C语言数据类型范围:http://blog.csdn.net/abaloon/article/details/8173552

(32位系统)

char -128 ~ +127 (1 Byte)
short -32767 ~ + 32768 (2 Bytes)
unsigned short 0 ~ 65536 (2 Bytes)
int -2147483648 ~ +2147483647 (4 Bytes)
unsigned int 0 ~ 4294967295 (4 Bytes)
long == int
long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
double 1.7 * 10^308 (8 Bytes)

unsigned int 0~4294967295 
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

[其他] 关于C语言中使用未声明函数的问题的更多相关文章

  1. c语言中的隐式函数声明(转)

    本文转自:http://www.jb51.net/article/78212.htm 在c语言里面开来还是要学习c++的编程习惯,使用函数之前一定要声明.不然,即使编译能通过,运行时也可能会出一些莫名 ...

  2. 万恶之源:C语言中的隐式函数声明

    1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(i ...

  3. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  4. C语言中可变参数的函数(三个点,“...”)

    C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...

  5. C语言中的未初始化变量的值

    C语言中未初始化的变量的值是0么 全局变量 .静态变量初始值为0局部变量,自动变量初始值随机分配 C语言中,定义局部变量时如果未初始化,则值是随机的,为什么? 定义局部变量,其实就是在栈中通过移动栈指 ...

  6. C语言中生产随机数 rand()函数

    参考资料:C语言中产生随机数 一:如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdl ...

  7. javascript语言中的一等公民-函数

    简介 在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作 ...

  8. c语言中不允许在函数外部给全局变量赋值

    今天,在写条件编译的时候,出现了在函数外部给全局变量赋值的情况,gcc报错,那么c语言为什么不允许在函数外部给变量赋值呢?为什么声明变量的时候可以对变量进行赋值? 出错代码: /* 2 * ===== ...

  9. 简答的理解C语言中的各种类型函数

    1.变参函数 变长参数的函数即参数个数可变.参数类型不定 的函数.最常见的例子是printf函数.scanf函数和高级语言的Format函数.在C/C++中,为了通知编译器函数的参数个数和类型可变(即 ...

随机推荐

  1. Example of how to implement a view-based source list (NSOutlineView) using Cocoa Bindings

    You tagged this with the cocoa-bindings tag, so I assume you mean "with bindings." I whipp ...

  2. 根据HTML语义化编码

    语义化标签——http://www.html5jscss.com/html5-semantics-section.html 写HTML代码时应注意什么? 尽可能少的使用无语义的标签div和span: ...

  3. 如何写好一个vue组件,老夫的一年经验全在这了【转】 v-bind="$attrs" 和 v-on="$listeners"

    如何写好一个vue组件,老夫的一年经验全在这了 一个适用性良好的组件,一种是可配置项很多,另一种就是容易覆写,从而扩展功能 Vue 组件的 API 来自三部分——prop.事件和插槽: prop 允许 ...

  4. [BZOJ3307]:雨天的尾巴(LCA+树上差分+权值线段树)

    题目传送门 题目描述: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式: 第一 ...

  5. bootstrap历练实例:按钮作为输入框组前缀或后缀

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. 第五次作业:Excel制作英文课程表

    要求: 一.内外变宽线条与颜色图同,表格有底纹色彩 二.横向打印,上下左右居中,表格标题居中,表头斜线,斜线两边加文字 三.设置打开密码

  7. ios之键盘的自定义

    一.键盘通知 当文本View(如UITextField,UITextView,UIWebView内的输入框)进入编辑模式成为first responder时,系统会自动显示键盘.成为firstresp ...

  8. CSS3的-字体 @font-face

    http://www.w3cplus.com/content/css3-font-face http://www.w3cplus.com/css3/web-icon-with-font-face ht ...

  9. 条款40:明智而审慎地使用多重继承(use multiple inheritance judiciously)

    NOTE: 1.多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. 2.virtual 继承会增加大小 速度 初始化(及赋值)复杂度等等成本.如果virtual base ...

  10. 【php】 PHP 支持 9 种原始数据类型

    PHP 支持 9 种原始数据类型. 四种标量类型: boolean(布尔型) integer(整型) float(浮点型,也称作 double) string(字符串) 三种复合类型: array(数 ...