Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 文件范围内的可变修改数组_C_Objective C_Arrays_Static_Constants - Fatal编程技术网

C 文件范围内的可变修改数组

C 文件范围内的可变修改数组,c,objective-c,arrays,static,constants,C,Objective C,Arrays,Static,Constants,我想创建一个常量静态数组,用于整个Objective-C实现文件,类似于“.m”文件顶层的类似内容: 我计划稍后在文件中使用NUM\u类型,所以我想把它放在一个变量中 然而,当我这样做时,我得到了错误 “在文件范围内可变修改的“类型” 我推测这可能与数组大小是一个变量有关(当我在其中放入整数文本时,我没有得到这条消息,比如静态int类型[4]) 我想解决这个问题,但也许我做错了……我有两个目标: 要获得可在整个文件中访问的数组 将NUM\u TYPES封装到一个变量中,这样我就不会将相同的文本分

我想创建一个常量静态数组,用于整个Objective-C实现文件,类似于“.m”文件顶层的类似内容:

我计划稍后在文件中使用
NUM\u类型
,所以我想把它放在一个变量中

然而,当我这样做时,我得到了错误

“在文件范围内可变修改的“类型”

我推测这可能与数组大小是一个变量有关(当我在其中放入整数文本时,我没有得到这条消息,比如
静态int类型[4]

我想解决这个问题,但也许我做错了……我有两个目标:

  • 要获得可在整个文件中访问的数组
  • NUM\u TYPES
    封装到一个变量中,这样我就不会将相同的文本分散在文件的不同位置
  • 有什么建议吗

    [编辑]
    在C常见问题解答中发现了这一点:

    如果您打算按照其他答案使用预处理器,那么您可以让编译器自动确定
    NUM\u类型的值:

    #define NUM_TYPES (sizeof types / sizeof types[0])
    static int types[] = { 
      1,
      2, 
      3, 
      4 };
    

    也可以使用枚举

    typedef enum {
        typeNo1 = 1,
        typeNo2,
        typeNo3,
        typeNo4,
        NumOfTypes = typeNo4
    }  TypeOfSomething;
    

    出现此警告的原因是,该值存储在内存地址,可能会被机器代码更改。

    Imho这是许多c编译器中的一个缺陷。我知道一个事实,我使用的编译器不在一个地址存储“static const”变量,而是用常量替换代码中的用法。这是可以验证的,因为在使用预处理器#define指令和使用静态常量变量时,生成的代码将获得相同的校验和


    无论哪种方式,您都应该使用静态常量变量,而不是尽可能使用#define,因为静态常量是类型安全的。

    正如其他答案中已经解释的那样,C中的
    常量仅意味着变量是只读的。它仍然是一个运行时值。但是,您可以使用
    enum
    作为C中的实常量:

    enum { NUM_TYPES = 4 };
    static int types[NUM_TYPES] = { 
      1, 2, 3, 4
    };
    

    哇,那真的很酷…我不知道这是可能的。我认为这种计算的成本可以忽略不计。我还可以假设编译器可以将其优化为静态值吗?是的,类似于这样的对象上的
    sizeof
    的结果是一个编译时常量。如果改为将其作为定义,会发生什么
    #define kNUM_TYPES 4
    ?这很有效…出于某种原因,我试图远离使用预处理器,因为我想我记得在某个地方读过,但我只是做了一些进一步的研究,找不到在这种情况下不使用它的好理由。我认为如果我在预处理器中创建对象(如
    @“一个NSString文本”
    )可能不太理想。你的代码的唯一错误是不需要分号。啊,是的,谢谢你的提醒,很高兴我能帮上忙。修改一个定义为
    常量的对象(例如,通过从指针中丢弃常量并存储值)是未定义的行为;因此,此类对象的值是编译时或运行时常量(取决于存储持续时间)。不能在常量表达式中使用该值,因为C标准没有说它可以。(如果目标对象未定义
    const
    或未动态分配,则允许丢弃
    const
    并存储值;字符串文字不是
    const
    ,但不能写入。)@jilles“可能被机器代码更改”并不意味着此答案的作者“可能被C代码更改"。此外,这还有另一个很好的原因:在编译当前TU时,不同TU中可能存在值未知的
    extern
    常量。改进此答案的方法是展示如何解决此问题。这听起来很糟糕,因为您可以获取
    静态常量
    变量的地址您所描述的行为可能是一种有效的优化,但肯定不是总能奏效的。它实际上很好。C编译器可以尽可能用常量值替换常量全局变量的单独使用。如果对变量的所有引用都转换为常量,则编译器可以删除如果你在任何地方使用地址,它都不会被删除。所有这些都不会改变这一点。根据语言标准,C不允许使用变量作为大小的全局数组,不管变量是否为常量。
    typedef enum {
        typeNo1 = 1,
        typeNo2,
        typeNo3,
        typeNo4,
        NumOfTypes = typeNo4
    }  TypeOfSomething;
    
    enum { NUM_TYPES = 4 };
    static int types[NUM_TYPES] = { 
      1, 2, 3, 4
    };