小括号对函数名说:没有我你就成不了函数。

  小括号对函数名说:没有我你就成不了函数。

  函数贯穿了我们学习C语言的整个过程(当然一开始就是main()函数了),同时程序也是由一个个函数组成的。写出一个好的函数我想是多么有成就感的事啊。

  小括号在函数的定义,如 int main(int argc, char **argv){}

  返回类型 函数名(变元说明表)
  {
    说明序列与语句序列
  }

  有函数定义了,当然就还需要函数的声明,如: int function(int var);

  在一个头文件中声明的任何一个函数可能又作为该头文件的一个宏实现了,比如getc()函数,在VC6.0的stdio.h里如下:

  

_CRTIMP int __cdecl getc(FILE *);  /* 这里是函数声明,实现在标准库里 */

 

  同时还有宏实现,如下:

  #define getc(_stream)     (--(_stream)->_cnt >= 0 \
                ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))  /* 这里是函数的宏定义 */

  那我们平时在写代码时调用的getc()函数到底是真正的函数呢,还只是一个宏定义呢?

  答案当然是宏定义了。

  那接着有几个问题:

  1.那我们要是想调用真正的函数呢?肿么办?

  2.比如说function()这是由一个宏实现的,如这样实现的#define function(var) (--var)

  那么我们想定义一个名为function的函数怎么办?如何不被宏扩展呢?

答案很简单,我想很多人第一个想到的就是#undef了,

不过还有个方法就是用小括号将函数名给括起来,如调用getc()函数而不是宏时,我们可以这样做:

/* 1 */
#include <stdio.h>
#undef getc
char ch = getc(stdin);

/* 2 */
#include <stdio.h>
char ch = (getc)(stdin);

  那通过显示声明,如

#include <stdio.h>
extern int getc(FILE *);
char ch = getc(stdin);
/* 这个呢?是宏展开呢,还是调用的函数呢?呵呵,答案很显然 */

  一个函数的任何宏定义都可以通过用括号把函数的名字括住来局部的抑制它,因为这个名字后面没有跟着指示一个宏函数名展开的左括号

  同理,即使一个库函数也作为宏被定义了,获得该函数的地址还是允许的。

   所以,一个实现必须为每个库函数提供一个实际的函数,即使它已经为该函数提供了一个宏。

  这些可能平时写程序都不会用到吧,不过真的挺有趣的,不是吗?

  在学习C语言的路上,有很多需要我们停下飞快的脚本慢慢品位的地方。

  那宏定义和真正的函数实现有什么区别呢,ISO C为什么规定把getc()用宏来实现呢?

  学习的快乐不是学到了多少多少知识,而是解决一个个问题,哪怕问题很小,也是件非常令人愉快的事情。

  医生说对着屏幕久了,记得扭扭脖子。一二三四五六七八……。祝大家身体健康。

  

posted @ 2012-07-29 01:59  idi0t  阅读(1753)  评论(2编辑  收藏  举报