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

在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 = 1;
    int a[10] = { 0 };
    int*b = a;
    float c = 0.01f;
    char d = 5;
    long long e = 2147483648;
    long long f = 2147483649;

    int a1 = test_1(a0);       //3
    int a2 = test_2(a0, a0 + 1);//3
    float a3 = test_3(a0, a0 + 1);//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 + 1);// 1065646818,  c在那边读取2.000, a0+1读为:1065646817
    int a7 = test_7(a0, d); //6
    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 + 2;
}
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[1] = 8;
    return a + 2;
}
int test_9(int a, int* c, float b)
{
    c[1] = 10;
    return a + 2;
}
int test_10(int a, float b, int* c)
{
    c[1] = 10;
    return a + 2;
}

long long test_11(int a, long long b)
{
    long long c =  b-1;
    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

时间: 2024-08-06 07:57:30

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

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

1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码.并没有不论什么报错,仅仅是在链接阶段由于找不到名为any_name_function的函数体而报错. [[email protected] t

【示例】C语言中利用数组存放函数指针

C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: int max(int,int); // 声明函数,比较两数大小 int (*p)(); //声明指向函数的指针变量 p=max; //将函数max的入口地址赋给指针变量p int c=(*p)(a,b); //调用函数 2.函数指针作为函数参数 该例子中每次给process函数不同实参(函数名)

C语言中关于时间的函数

C语言中关于时间的函数 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,南平私家侦探(http://user.qzone.qq.com/778607337)并对计时.时间的获取.时间的计算和显示格式等方面进行了阐述.本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法. 关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元) 注:linux系统时间如

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

C语言中可变参数的函数(三个点,"...") 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解. 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void foo(parm_list,...); 这种方式和我们以前认识的不大

C语言中的可变参数函数 三个点“…”printf( const char* format, ...)

第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s",

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

1.变参函数 变长参数的函数即参数个数可变.参数类型不定 的函数.最常见的例子是printf函数.scanf函数和高级语言的Format函数.在C/C++中,为了通知编译器函数的参数个数和类型可变(即是不定的.未知的),就必须以三个点结束该函数的声明. 1 // printf函数的声明 2 int printf(const char * _Format, ...); //const char * _Format是格式控制,控制有多少个%d...,确定输出的个数与类型 3 4 //scanf函数声

C语言中变量名及函数名的命名规则与驼峰命名法

一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error  float 为保留字不允许用): 二.函数名的命名规则 1.见名知意:2.自定义函数函数名首字母大写(库函数里的函数名都是以小写字母定义,为了区分库函数和自定义函数,避免冲突). 三.宏定义里面的变量 全大写 eg:#define SIZE 100(后面函数所有出现的SIZE全用100代替,它在所有

C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数

1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technician.cpp: source.cpp: 5员工管理案例-销售和经理实现 修改employee.h: displayStatus不用虚函数了 salesman.h: salesman.cpp: manager.h: manager.cpp: 6员工管理案例-销售经理的实现 7 中午回顾 注意: 多继承

c语言中位段的声明和结构

位段 (bit field)也叫位域 位段的声明和结构类似,但是它的成员是一个或多个位的字段,这些不同长度的字段实际上存储于一个或多个整形变量中. 位段的声明和任何普通成员声明相同,有两个例外: 1.位段成员必须声明为int ,signed int(有符号整型),unsigned int(无符号整型) 2.成员名后面是一个冒号和一个整数,这个整数指定该位段所占用位的数目. Eg: #include<stdio.h>                             #include<