了解函数参数是否是函数调用的一部分



好吧,我认为这几乎是不可能的。但是:是否可以在方法调用内部知道该方法是否是作为函数调用的一部分调用的?

示例(以及我实际的函数调用):

HDMExpressionSQLSelectBuilder *sb = [[[HDMExpressionSQLSelectBuilder alloc] init] autorelease];
[sb orNestedWhere:[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"], [sb where:@"wheraCoumnB" equals:@"sth"], nil];

从现在开始有两件事发生:

  • 参数按任何顺序求值(其中顺序不是在C标准中指定,并且它在编译器和设置)
  • 尽管这对每个程序员来说都是显而易见的:函数在

现在我想知道这个方法调用中的例子。。。

 [sb where:@"wheraCoumnB" equals:@"whereBEqualValue"]

它是作为函数参数的一部分调用的。

可能吗?黑色魔法?

在你来说我做错了,我应该修复我的代码之前:我声称我有一种罕见的情况,知道这样的事情是有意义的。我正在编写一个查询生成器,这将大大简化嵌套条件的使用。否则,我将不得不做一些愚蠢的nestedAndBegin和后来的nestedAndEnd来实现括号,等等。在这种情况下会很尴尬,我的查询生成器是基于树的,我不想这样做(与字符串杂耍的查询生成器不同,所需的只是将逻辑表达式的节点放在适当的位置)。

更新

因此,毫不奇怪,这是不可能的。对于那些对我如何解决我的特定问题感兴趣的人来说:我这样做是为了推迟对函数的所有调用,所以对查询生成器的函数的调用会将一个带有函数参数的方法调用对象放在调用列表中。它当时不执行任何方法代码。每个调用对象都有一个auto-inc序列Id,所以我知道函数何时被求值。现在,在nestedAnd等函数中(我的问题是关于这些函数的),我检查存储的调用对象的序列Id是否与函数调用的参数索引相对应。如果没有,现在是重新排序的正确时机。

语法检查和查询构建阶段随后被推迟,直到用户实际调用query()方法(或ast()来获取表达式树)。

不,没有(实用的)方法可以做到这一点。

理论上,您可以在方法中添加一些代码,从二进制文件中读取调试符号,检查链接寄存器,然后使用这些信息来确定调用位置,从其他地方加载源代码,并计算映射,解析源代码,然后根据您的描述来确定它被调用。

最新更新