【问题标题】:Using constant to declare an array of item使用常量声明项目数组
【发布时间】:2012-04-05 08:20:29
【问题描述】:

是否可以在 Objective-C 中使用类似的东西:

#define number_of_items 10

然后将其用作:

int arr[number_of_items];

【问题讨论】:

  • 是的,我们可以在 .m 文件中执行此操作,但不能在 .h 文件中执行此操作。我在 .pch 文件中定义了一个常量,我想在 .hi 文件中使用这个常量。有可能吗?
  • 我再次重申:为什么你要编辑 PCH 文件?
  • 它是一个共享的头文件。我通常用它来定义常量。但我的问题不是 .pch 文件。

标签: objective-c arrays constants c-preprocessor


【解决方案1】:

是的,假设您的意思是Objective C。它几乎是“正确”C 的超集,所以这完全没问题。在 C 和 C++ 中也可以。

您可以在以下脚本中看到它有效:

pax> cat qq.m
#import <objc/Object.h>

// First method.

#define number_of_items 10
int arr[number_of_items];

// Second method.

#define NUMBER_OF_ROWS 10
@interface test : Object{ int xyzzy[NUMBER_OF_ROWS]; }
@end;

pax> vi qq.m ; gcc -o qq.o -c qq.m -lobjc

pax> # no errors occurred

而且,现在我们终于看到了你实际上在使用什么:

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define NUMBER_OF_ROWS_ (IS_IPAD? 18: 18)

NUMBER_OF_ROWS_不是一个常数,因为它取决于函数UI_USER_INTERFACE_IDIOM()的返回值。

换句话说,它不能在编译时计算。这就是您收到错误的原因。你可以通过编译以下代码看到这一点:

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define NUMBER_OF_ROWS_ (IS_IPAD ? 18: 20)

int UI_USER_INTERFACE_IDIOM(void) {return 20;}
int UIUserInterfaceIdiomPad;

int main (void) {
    int arr[NUMBER_OF_ROWS_];
    return 0;
}

gcc --pedantic 下,你会得到:

qq.m: In function ‘main’:
qq.m:8: warning: ISO C90 forbids variable length array ‘arr’

您要么需要使用像NSMutableArray 这样的可动态调整的集合,要么使用所需的最大大小的数组,并且只使用您需要的。

【讨论】:

  • 我收到此错误:实例变量必须具有恒定大小
  • 那么你没有使用定义。它必须是一个变量。
  • 我得到了这个错误:实例变量必须有一个恒定的大小 @interface test : NSObject{ int arr[NUMBER_OF_ROWS];我已经在共享头文件 .pch 中定义了 NUMBER_OF_ROWS 这可能是什么原因?
  • @phuongho,你为什么要处理预编译的头文件?它们不是供用户编辑的,它们是构建系统的辅助工具。在任何情况下,使用 #define 来调整数组大小是完全可以的,所以我必须得出结论,NUMBER_OF_ROWS 不是之一 - 您需要在问题中显示更多细节。
  • 假设您有一个基于整数数组的 Ios 项目,其中包含 NUMBER_OF_ROWS 个项目。一开始你只想让它变小,但之后你想让它变小。小或大属于常数 NUMBER_OF_ROWS。那就是我想用这种方式的原因!
猜你喜欢
  • 2015-05-21
  • 2012-10-19
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多