Too many arguments provided to function-like macro invocation 或

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__ : @"<Unknown 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__)

时间: 2024-11-26 06:40:07

Too many arguments provided to function-like macro invocation 或的相关文章

[Compose] 16. Apply multiple functors as arguments to a function (Applicatives)

We find a couple of DOM nodes that may or may not exist and run a calculation on the page height using applicatives. For example we want to get the main content section size by reduce the height of header and footer, nomarlly we will do like this: 1.

The difference between macro and function(from c and pointer )

macro is typeless and execute faster than funtion ,becaus of the overhead of calling and returnning of function,but macro will increase the size of program due  to many time's substitution,as well as the side effect of macro  may cause unexpected res

[Ramda] Eliminate Function Arguments (Point-Free Style) with Ramda&#39;s Converge

When doing comparisons inside of functions, you end of relying heavily on the argument passed into the function. Ramda's converge allows you to do comparisons in a Point-Free style allowing you more flexibility with composing and constructing functio

Function.prototype.bind接口浅析

本文大部分内容翻译自 MDN内容, 翻译内容经过自己的理解. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind Function.prototype.bind Syntax fun.bind(thisArg[, arg1[, arg2[, ...]]]) Parameters thisArg The value to be passed as the thi

a note of R software write Function

Functionals “To become significantly more reliable, code must become more transparent. In particular, nested conditions and loops must be viewed with great suspicion. Complicated control flows confuse programmers. Messy code often hides bugs.” — Bjar

String类型,Function类型

1.String类型:  1)创建String对象:    var str=new String(s);    String(s);    参数:参数 s 是要存储在 String 对象中的值或转换成原始字符串的值.    返回值:当String()和运算符new一起作为构造函数使用时,它返回一个新创建的String对象,存放的是字符串s          当不用 new 运算符调用String()时,它只把 s 转换成原始的字符串,并返回转换后的值. 2)String对象属性:    leng

arguments.callee

arguments.callee在哪个函数中运行,他就代表哪个函数,一般在匿名函数中.在匿名函数中有时需要自己调用自己,但是由于是匿名函数,没有名字,所以可以用arguments.callee来代替匿名的函数. arguments: arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function:选项.当前正在执行的 Function 对象的名字. n :选项.要传递给 Function 对象的从0开始的参数值索引.说明Ar

JavaScript Function 函数深入总结

整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下文,私有变量等知识点的深入理解. 函数中的return return 语句可以不带有任何返回值,在这种情况下( return; 或函数中不含 return 语句时),函数在停止执行后将返回 undefiend 值.这种用法一般在需要提前停止函数执行而又不需要返回值的情况下. return false

js的隐含参数(arguments,callee,caller)使用方法

在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments arguments 该对象代表正在执行的函数和调用它的函数的参数.[function.]arguments[n]参数function:选项.当前正在执行的 Function 对象的名字. n :选项.要传递给 Function 对象的从0开始的参数值索引.说明Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象.Arguments是一个类似数组但不是数组的对象,说它类似数组是因为