博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Too many arguments provided to function-like macro invocation 或
阅读量:4663 次
发布时间:2019-06-09

本文共 2684 字,大约阅读时间需要 8 分钟。

1、问题
2、解决问题的办法
 
将Build Setting下的Apple LLVM 7.0选择成GUN99

 

3、产生此问题的原因

3.1、在NSException.h的文件中定义了如下宏

/* * Asserts to use in Objective-C method bodies */#if !defined(NSAssert)//使用了NSAssert宏 #define NSAssert5(condition, desc, arg1, arg2, arg3, arg4, arg5) \ __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ _NSAssertBody((condition), (desc), (arg1), (arg2), (arg3), (arg4), (arg5)) \ __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS #define NSAssert4(condition, desc, arg1, arg2, arg3, arg4) \ __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ _NSAssertBody((condition), (desc), (arg1), (arg2), (arg3), (arg4), 0) \ __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS #define NSAssert3(condition, desc, arg1, arg2, arg3) \ __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ _NSAssertBody((condition), (desc), (arg1), (arg2), (arg3), 0, 0) \ __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS #define NSAssert2(condition, desc, arg1, arg2) \ __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ _NSAssertBody((condition), (desc), (arg1), (arg2), 0, 0, 0) \ __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS #define NSAssert1(condition, desc, arg1) \ __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ _NSAssertBody((condition), (desc), (arg1), 0, 0, 0, 0) \ __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS #define NSAssert(condition, desc) \ __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ _NSAssertBody((condition), (desc), 0, 0, 0, 0, 0) \ __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS #endif
//在如下NSAssert的定义中,出现了##__VA_ARGS__#define NSAssert(condition, desc, ...) \    do {    \ __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \ if (!(condition)) {  \            NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \ __assert_file__ = __assert_file__ ? __assert_file__ : @"
"; \ [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \ object:self file:__assert_file__ \ lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \ } \ __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \ } while(0) #endif

3.2 ##__ VA_ARGS__的追本溯源

1)##__ VA_ARGS__代表带有可变参数的宏

2)可变参数宏不被ANSI/ISO C++ 所正式支持。因此,你应当检查你的编译器,看它是否支持这项技术。

即Xcode的Build Setting下的Apple LLVM 7.0要选择成GUN99

3)在1999年版本的ISO C 标准中,宏可以象函数一样,定义时可以带有可变参数。宏的语法和函数的语法类似。下面有个例子:

//’…’指可变参数,被表示成零个或多个符号,包括里面的逗号.//当被调用时,在宏体(macro body)中,那些符号序列集合将代替里面的__VA_ARGS__标识符。#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)

4)GCC始终支持复杂的宏,它使用一种不同的语法从而可以使你可以给可变参数一个名字,如同其它参数一样。例如下面的例子:

#define debug(format, args...) fprintf (stderr, format, args)

5)CPP使用一个特殊的’##’操作。书写格式为:

//这里,如果可变参数被忽略或为空,’##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号。//如果你在宏调用时,确实提供了一些可变参数,GNU CPP也会工作正常,它会把这些可变参数放到逗号的后面。像其它的pasted macro参数一样,注意这些参数不是宏的扩展。#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
 
  • C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用 » reille blog

 

转载于:https://www.cnblogs.com/liaolijun/p/5829516.html

你可能感兴趣的文章
怎么样调整FreeBSD时区问题
查看>>
Linux CentOS 7的图形界面安装(GNOME、KDE等)
查看>>
大理石
查看>>
python执行外部程序的常用方法小结
查看>>
微信二维码生成
查看>>
linux中 ll 和ls 区别
查看>>
有关js中能否使用equals来判断相等的问题
查看>>
(十八)多线程
查看>>
bzoj4580: [Usaco2016 Open]248
查看>>
HTML5 VS. Flash&Flex? – 浅谈Flash/Flex/HTML 5技术选型
查看>>
响应者链条
查看>>
基于定位的社交应用Foursquare开源网址(wp7)
查看>>
机电传动控制读书笔记二(书本内容)
查看>>
Address already in use: JVM_Bind<null>:8080错误的解决办法
查看>>
Vue子组件监听事件中传递参数的方法
查看>>
面向对象的几种方法详解(后)
查看>>
年龄问题
查看>>
winform自动更新并实现文件的批量异步下载
查看>>
UVA 301 Transportation
查看>>
MYSQL的常用命令和增删改查语句和数据类型!
查看>>