| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 527 人关注过本帖, 1 人收藏
标题:#ifndef 后 参数加括号会报警
只看楼主 加入收藏
纯蓝之刃
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:41
帖 子:489
专家分:3154
注 册:2019-7-29
结帖率:92.31%
收藏(1)
已结贴  问题点数:30 回复次数:8 
#ifndef 后 参数加括号会报警
#ifndef min(a,b)
#define    min(a,b) ((a < b) ? a : b)
#endif


会报警warning: extra tokens at end of #ifndef directive
求解决方案

debain 32位下gcc编译
搜索更多相关主题的帖子: 报警 min gcc 参数 括号 
2020-06-11 16:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:387
帖 子:7657
专家分:44766
注 册:2011-1-18
收藏
得分:5 
#ifndef min(a,b)
改为
#ifndef min
2020-06-11 16:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:387
帖 子:7657
专家分:44766
注 册:2011-1-18
收藏
得分:20 
另外,第一步建议
((a < b) ? a : b)
改为
( (a)<(b) ? (a) : (b) )
因为这是个“宏”,并不像普通函数那样“传值”,它的参数可能是个复杂的表达式,会扰乱意想中的“优先级”,比如 min( a=1, 2 ) 之类。

第二步,建议调换比较,即改为
( (b)<(a) ? (b) : (a) )
因为a、b可能是浮点数,浮点数的值可能是“非格式化数”,任何数与“非格式化数”相比较都返回false。
是谁提交的这个bug report我忘了,但这个bug report提交后,各家的C++库都立马改掉了这个bug

2020-06-11 16:33
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:5 
正好看到linux 5.6.9内核里也有最小值,不过有点复杂,linux/include/linux/kernel.h

梦想拥有一台龙芯3A-4000
2020-06-11 16:55
纯蓝之刃
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:41
帖 子:489
专家分:3154
注 册:2019-7-29
收藏
得分:0 
如果我想这样使用    len = min (x, y);
那么我应该如何定义这个min的函数
定义成#ifndef min如何对变量a,b进行操作

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-06-11 17:02
kangaroo1212
Rank: 1
等 级:新手上路
帖 子:6
专家分:9
注 册:2020-5-24
收藏
得分:0 
#ifndef 标识符!
据查资料,上面是语法要求!不能你那样使用带参数的宏,带参数的宏用于#define命令!
2020-06-11 17:21
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:0 
以下是引用rjsp在2020-6-11 16:33:45的发言:
浮点数的值可能是“非格式化数”


麻烦问下r版,这个“非格式化数”是啥?没理解这个为啥会一直false
2020-06-11 17:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:387
帖 子:7657
专家分:44766
注 册:2011-1-18
收藏
得分:0 
回复 7楼 fulltimelink
“非规格化数” 就是 “不正确的浮点数格式”

程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    double a;
    memset( &a, 0xFF, sizeof(a) );

    printf( "%f\n", a );    // -nan
    printf( "%d\n", a<a );  // 0
    printf( "%d\n", a<=a ); // 0
    printf( "%d\n", a>a );  // 0
    printf( "%d\n", a>=a ); // 0
    printf( "%d\n", a==a ); // 0
    printf( "%d\n", a!=a ); // 1
}
2020-06-12 08:25
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:0 
回复 8楼 rjsp
学习了
2020-06-12 10:46
快速回复:#ifndef 后 参数加括号会报警
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.065983 second(s), 8 queries.
Copyright©2004-2020, BCCN.NET, All Rights Reserved