请考虑以下代码:
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关键字不应该使指针成为常量.有任何想法吗?
请考虑以下代码:
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严格别名规则?请解释为何合法/非法.
我想以便携方式(C99)将一种类型的数据重新解释为另一种类型.我不是在谈论铸造,我想重新解释一些给定的数据.此外,通过便携式我的意思是它不会破坏C99规则 - 我并不是说重新解释的值在所有系统上都是相同的.
我知道3种不同的重新解释数据的方法,但其中只有两种是可移植的:
这不是便携式的 - 它打破了严格的别名规则.
/* #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)这是依赖于平台的,因为它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)应该没问题,只要 sizeof(int) == sizeof(float)
/* #3 Copying */
float float_value = 3.14;
int int_value = …Run Code Online (Sandbox Code Playgroud)请考虑以下代码:
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)
据我所知,这可能导致陷阱表示.我的问题:
当我使用像make这样的外部构建系统的Xcode 4时,我会丢失代码完成和语法高亮.有没有什么办法解决这一问题?
使用NSFileCoordinator编写文件时,我需要指定正确的NSFileCoordinatorWritingOptions.虽然详细解释了,但我不知道何时使用哪一个.可用选项包括:
例如,如果我想创建一个文件(例如plist),那么哪个选项是正确的?我修改文件时哪一个?
有人可以解释NSFileCoordinatorWritingOptions以便更好地理解吗?
c ×4
autocomplete ×1
cocoa ×1
const ×1
icloud ×1
makefile ×1
memcpy ×1
type-punning ×1
typedef ×1
xcode4 ×1