小编Joh*_*nes的帖子

typedef指针const古怪

请考虑以下代码:

typedef struct Person* PersonRef;
struct Person {
  int age;
};

const PersonRef person = NULL;

void changePerson(PersonRef newPerson) {
  person = newPerson;
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,编译器抱怨只读值不可分配.但是const关键字不应该使指针成为常量.有任何想法吗?

c typedef const

22
推荐指数
3
解决办法
1万
查看次数

嵌套结构和c中的严格别名

请考虑以下代码:

typedef struct {
  int type;
} object_t;

typedef struct {
  object_t object;
  int age;
} person_t;

int age(object_t *object) {
  if (object->type == PERSON) {
    return ((person_t *)object)->age;
  } else {
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是合法代码还是违反了C99严格别名规则?请解释为何合法/非法.

c pointer-aliasing

17
推荐指数
1
解决办法
1732
查看次数

便携式数据重新解释

我想以便携方式(C99)将一种类型的数据重新解释为另一种类型.我不是在谈论铸造,我想重新解释一些给定的数据.此外,通过便携式我的意思是它不会破坏C99规则 - 我并不是说重新解释的值在所有系统上都是相同的.

我知道3种不同的重新解释数据的方法,但其中只有两种是可移植的:

  1. 这不是便携式的 - 它打破了严格的别名规则.

    /* #1 Type Punning */
    
    float float_value = 3.14;
    int *int_pointer = (int *)&float_value;
    int int_value = *int_pointer;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这是依赖于平台的,因为它int在写入之后从联合中读取值float.但它不会破坏任何C99规则,所以它应该工作(如果sizeof(int) == sizeof(float)).

    /* #2 Union Punning */
    
    union data {
      float float_value;
      int int_value;
    };
    
    union data data_value;
    data_value.float_value = 3.14;
    int int_value = data_value.int_value;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 应该没问题,只要 sizeof(int) == sizeof(float)

    /* #3 Copying */
    
    float float_value = 3.14;
    int int_value = …
    Run Code Online (Sandbox Code Playgroud)

c type-punning

14
推荐指数
1
解决办法
2860
查看次数

使用memcpy避免陷阱表示

请考虑以下代码:

float float_value = x; // x is any valid float value
int int_value = 0;
size_t size = sizeof(int) < sizeof(float) ? sizeof(int) : sizeof(float);
memcpy(&int_value, &float_value, size);
Run Code Online (Sandbox Code Playgroud)

据我所知,这可能导致陷阱表示.我的问题:

  1. 真的吗?
  2. 如果没有,为什么?
  3. 如果没有,是否有另一种方法可以避免可能的陷阱表示?

c memcpy

11
推荐指数
1
解决办法
631
查看次数

Xcode 4外部构建系统代码完成

当我使用像make这样的外部构建系统的Xcode 4时,我会丢失代码完成和语法高亮.有没有什么办法解决这一问题?

makefile autocomplete syntax-highlighting xcode4

6
推荐指数
1
解决办法
3009
查看次数

NSFileCoordinator正确用法

使用NSFileCoordinator编写文件时,我需要指定正确的NSFileCoordinatorWritingOptions.虽然详细解释了,但我不知道何时使用哪一个.可用选项包括:

  • NSFileCoordinatorWritingForDeleting
  • NSFileCoordinatorWritingForReplacing
  • NSFileCoordinatorWritingForMoving
  • NSFileCoordinatorWritingForMerging

例如,如果我想创建一个文件(例如plist),那么哪个选项是正确的?我修改文件时哪一个?

有人可以解释NSFileCoordinatorWritingOptions以便更好地理解吗?

cocoa icloud nsfilecoordinator

5
推荐指数
1
解决办法
2498
查看次数