注册 登录
编程论坛 C语言论坛

#ifndef 后 参数加括号会报警

纯蓝之刃 发布于 2020-06-11 16:16, 2592 次点击
#ifndef min(a,b)
#define    min(a,b) ((a < b) ? a : b)
#endif


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

debain 32位下gcc编译
8 回复
#2
rjsp2020-06-11 16:21
#ifndef min(a,b)
改为
#ifndef min
#3
rjsp2020-06-11 16:33
另外,第一步建议
((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

#4
ditg2020-06-11 16:55
正好看到linux 5.6.9内核里也有最小值,不过有点复杂,linux/include/linux/kernel.h
#5
纯蓝之刃2020-06-11 17:02
如果我想这样使用    len = min (x, y);
那么我应该如何定义这个min的函数
定义成#ifndef min如何对变量a,b进行操作
#6
kangaroo12122020-06-11 17:21
#ifndef 标识符!
据查资料,上面是语法要求!不能你那样使用带参数的宏,带参数的宏用于#define命令!
#7
fulltimelink2020-06-11 17:28
以下是引用rjsp在2020-6-11 16:33:45的发言:
浮点数的值可能是“非格式化数”


麻烦问下r版,这个“非格式化数”是啥?没理解这个为啥会一直false
#8
rjsp2020-06-12 08:25
回复 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
}
#9
fulltimelink2020-06-12 10:46
回复 8楼 rjsp
学习了
1