A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 远人 中级黑马   /  2014-3-31 11:30  /  1414 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是关于c语言宏定义的的一段简单代码,今天我默写,发现了一个问题,不明白,代码如下
  1. #include <stdio.h>

  2. #define sum(v1 , v2)  ((v1) + (v2))
  3. int main(int argc, const char * argv[])
  4. {
  5.    
  6. //    int sum(int v1 ,int v2);
  7.    
  8.     int a = sum(4 ,5) * sum(3, 2);
  9.    
  10.     printf("a的值是%d\n",a);
  11.    
  12.     return 0;
  13. }
复制代码


如代码所示,在编写程序前,使用一个变量都需要先定义,代码中我唯一注释的一行 //    int sum(int v1 ,int v2);  就是我自己写的定义,但是加入到代码中之后总是报错,报错原因也是莫名其妙,不要这行代码注释掉之后代码正确,这是为什么?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

5 个回复

倒序浏览
函数名和宏定义名重复冲突了。预编译会把函数也给替换了就会导致莫名其妙的错误。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
#define sum(v1 , v2)  ((v1) + (v2)),就是一个宏定义,就等于有了一个真身和替身
你下边又弄了一个 int sum(int v1 ,int v2);不就是自相矛盾了吗
回复 使用道具 举报
本帖最后由 Hi围城 于 2014-3-31 13:42 编辑
  1. #include <stdio.h>

  2. #define sum(v1 , v2)  ((v1) + (v2))
  3. int main(int argc, const char * argv[])
  4. {
  5.    
  6.     //    int sum(int v1 ,int v2);
  7.     /* int ((int v1) + (int v2)); */ // 你定义的宏的处理效果,此处编译不能通过。
  8.    
  9.     int a = sum(4 ,5) * sum(3, 2);
  10.     /* int = ((4) + (5)) * ((3) + (2)); */ // 你定义的宏的处理效果
  11.    
  12.     printf("a的值是%d\n",a);
  13.    
  14.     return 0;
  15. }

  16. // 预处理指令宏定义执行之后,第8行其实变成了一个被错误取名的变量,变量是标识符的一种,由英文字母大小写,0~9的阿拉伯数字和_下划线组成,且不能以数字开头。
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报

恩,这个解释有道理!
回复 使用道具 举报
对啊 ,怎么能重名呢,C语言是严格区分大小写的,更别说重命名了!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马