在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. 虚拟DOM -------- 最易理解的解释

    虚拟DOM是最先由Facebook在react里使用的, 虚拟DOM是一个特别棒的概念,我们都知道,在浏览器上进行DOM操作的时候,会特别的消耗性能而且响应.渲染特别慢,但是有了虚拟DOM就不一样了, ...

  2. OpenRead方法打开文件并读取

    实现效果: 知识运用: File类的OpenRead方法 //实现打开现有文件以进行读取 public static FileStream OpenRead(string path) FileStre ...

  3. java解析sql文件

    package com.athena.ckx.util; import java.io.FileInputStream; import java.io.InputStream; import java ...

  4. syslog(),closelog()与openlog()--日志操作函数 (1)

    文章出处:http://blog.csdn.net/xx77009833/archive/2010/07/30/5776383.aspx 为了满足某些目的,进行日志记录是很有必要的. 在典型的 LIN ...

  5. bootstrap历练实例: 基本胶囊式的导航菜单

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

  6. shelll脚本,根据软链接,找到真实路径

    [root@localhost tmp]# ls -l total lrwxrwxrwx root root Sep : abc -> /etc/passwd lrwxrwxrwx root r ...

  7. Linux基础学习-Postfix与Dovecot部署邮件系统

    电子邮件系统 电子邮件系统是我们在日常工作.生活中最常用的一种网络服务. 部署基础的电子邮件系统 [root@qdlinux ~]# yum install bind-chroot -y [root@ ...

  8. 蓝牙学习 (7) - raspberrryPi 扫描TI sensorTag

    前面几篇分别简单涉及了 raspberryPi上bluez BLE sniffer TI SensorTag https://blog.csdn.net/feiwatson/article/detai ...

  9. LeetCode(137) Single Number II

    题目 Given an array of integers, every element appears three times except for one. Find that single on ...

  10. The North American Invitational Programming Contest 2018 D. Missing Gnomes

    A family of nn gnomes likes to line up for a group picture. Each gnome can be uniquely identified by ...