我想在 Utils 类中定义 min 和 max 方法。

@interface Utils

int min(int a, int b);
int max(int a, int b);

@end

但我不想有命名参数。这将是一个太沉重的符号。我想使用 C 风格的定义。但是之后 [Utils min(a, b)] 因为打电话不起作用。我的问题是什么?

预先感谢您的任何帮助

有帮助吗?

解决方案

由于不使用目标c的OS X执行,则可能无法访问预定义的MIN和MAX的宏。

可以自己定义这些作为

#define MIN(a,b)    ((a) < (b) ? (a) : (b))
#define MAX(a,b)    ((a) > (b) ? (a) : (b))

有可能是一个更好的方式来定义它们,但这些都会为您创建简单的宏。您可以将它们添加到任何共同的.h文件中,你的类,通常的份额。

其他提示

它已定义为一个宏。

MIN(a, b)

MAX(a, b)

您不需要重新定义这些的。

有与发布的布兰登·博德纳尔(这本书写的时间被标记为一个有效的解决方案)的解决方案一个严重的问题。

问题描述如下: HTTP:/ /gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Min-and-Max.html 和(有效和安全的)解决它: HTTP:/ /gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Typeof.html

检查出来自己:

#include <stdio.h>

#define NAIVE_MAX(a,b) (a > b ? a : b)

#define NAIVE_MIN(a,b) (a < b ? a : b)

#if !defined MAX
#define MAX(a,b) \
({ __typeof__ (a) __a = (a); \
__typeof__ (b) __b = (b); \
__a > __b ? __a : __b; })
#endif

#if !defined MIN
#define MIN(a,b) \
({ __typeof__ (a) __a = (a); \
__typeof__ (b) __b = (b); \
__a < __b ? __a : __b; })
#endif

int main (int argc, const char * argv[]) {
    int a = 3;
    int b = 5;

#pragma mark NON-FATAL CASES:
    printf("NAIVE_MAX(%d, %d) => %d\n", a, b, NAIVE_MAX(a, b));
    printf("NAIVE_MIN(%d, %d) => %d\n", a, b, NAIVE_MIN(a, b));

    printf("MAX(%d, %d) => %d\n", a, b, MAX(a, b));
    printf("MIN(%d, %d) => %d\n", a, b, MIN(a, b));

    printf("\nEverything fine so far...\n\n");

#pragma mark FATAL CASES:
    //cache:
    int _a = a;
    int _b = b;
    printf("NAIVE_MAX(%d++, %d++) => %d\n", _a, _b, NAIVE_MAX(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("NAIVE_MIN(%d++, %d++) => %d\n", _a, _b, NAIVE_MIN(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("NAIVE_MAX(++%d, ++%d) => %d\n", _a, _b, NAIVE_MAX(++a, ++b));

    //reset:
    a = _a;
    b = _b;
    printf("NAIVE_MIN(++%d, ++%d) => %d\n", _a, _b, NAIVE_MIN(++a, ++b));

    printf("\nOuch, this doesn't look right at all!\n\n");

#pragma mark NON-FATAL CASES:
    //reset:
    a = _a;
    b = _b;
    printf("MAX(%d++, %d++) => %d\n", _a, _b, MAX(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("MIN(%d++, %d++) => %d\n", _a, _b, MIN(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("MAX(++%d, ++%d) => %d\n", _a, _b, MAX(++a, ++b));

    //reset:
    a = _a;
    b = _b;
    printf("MIN(++%d, ++%d) => %d\n", _a, _b, MIN(++a, ++b));

    printf("\nAh, much better now.\n\n");

    return 0;
}

控制台日志:

NAIVE_MAX(3, 5) => 5
NAIVE_MIN(3, 5) => 3
MAX(3, 5) => 5
MIN(3, 5) => 3

Everything fine so far...

NAIVE_MAX(3++, 5++) => 6
NAIVE_MIN(3++, 5++) => 4
NAIVE_MAX(++3, ++5) => 7
NAIVE_MIN(++3, ++5) => 5

Ouch, this doesn't look right at all!

MAX(3++, 5++) => 5
MIN(3++, 5++) => 3
MAX(++3, ++5) => 6
MIN(++3, ++5) => 4

Ah, much better now.

所以永远使用天真实施所看到上面(以及由布兰登·博德纳尔建议,对不起,哥们;)的代码。如果你想避免这样的最坏的情况下)

这可能是不适合这种特定应用是一个好主意,但它是可能写Objective-C的方法用参数“没有名字”,或者更确切地说带有零长度名称:

+ min:(int)a :(int)b;
...
[Utils min:a :b]

(选择器将是@selector(min::)。)

目标-C类方法使用命名参数,周期。这只是事情是这样的。

为什么不使它成为全球性的,免费的功能?你不应该需要一个utils的类这种事情。

如果你不希望扰乱全局命名空间,你可以使用的Objective-C ++(重命名所有.m文件到.mm),并把它放在一个命名空间。

在名为“XXIntegerMath.h”的模板文件中放置此...

#import <Foundation/Foundation.h>

static inline NSInteger imax(NSInteger a, NSInteger b) {
    return  a > b ? a : b;
}

static inline NSInteger imin(NSInteger a, NSInteger b) {
    return  a < b ? a : b;
}

然后在你的 Objective-C 课程中......

#import "XXIntegerMath.h"
NSInteger minValue = imin(someValue, someOtherValue);

它不会遇到 Regexident 描述的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top