Преобразование NSValues ​​в CGPoint [дубликат]

Порядок, в котором указаны взаимозависимые связанные библиотеки, неверен.

Порядок, в котором связаны библиотеки, имеет значение, если библиотеки зависят друг от друга. В общем случае, если библиотека A зависит от библиотеки B, тогда libA ДОЛЖЕН появляться перед libB в флагах компоновщика.

Например:

// B.h
#ifndef B_H
#define B_H

struct B {
    B(int);
    int x;
};

#endif

// B.cpp
#include "B.h"
B::B(int xx) : x(xx) {}

// A.h
#include "B.h"

struct A {
    A(int x);
    B b;
};

// A.cpp
#include "A.h"

A::A(int x) : b(x) {}

// main.cpp
#include "A.h"

int main() {
    A a(5);
    return 0;
};

Создайте библиотеки:

$ g++ -c A.cpp
$ g++ -c B.cpp
$ ar rvs libA.a A.o 
ar: creating libA.a
a - A.o
$ ar rvs libB.a B.o 
ar: creating libB.a
a - B.o

Скомпилируйте:

$ g++ main.cpp -L. -lB -lA
./libA.a(A.o): In function `A::A(int)':
A.cpp:(.text+0x1c): undefined reference to `B::B(int)'
collect2: error: ld returned 1 exit status
$ g++ main.cpp -L. -lA -lB
$ ./a.out

Чтобы повторить снова, порядок имеет значение!

5
задан mderk 20 January 2014 в 12:19
поделиться

3 ответа

Это даст правильный результат в любом случае:

 NSNumber *n = @42.42;
 CGFloat cgf = [n doubleValue];

, поскольку CGFloat либо float, либо double.


NSNumber не имеет метода CGFloatValue. Вы можете определить один, используя бесплатный мост до CFNumberRef:

@interface NSNumber (MyCGFloatValue)
-(CGFloat)myCGFloatValue;
@end

@implementation NSNumber (MyCGFloatValue)
-(CGFloat)myCGFloatValue{
    CGFloat result;
    CFNumberGetValue((__bridge CFNumberRef)(self), kCFNumberCGFloatType, &result);
    return result;
}
@end

или используя функцию C11 «Общий выбор», где компилятор выбирает соответствующий код в зависимости от по типу CGFloat:

@implementation NSNumber (MyCGFloatValue)
-(CGFloat)myCGFloatValue{
    CGFloat result;
    result = _Generic(result,
            double: [self doubleValue],
            float: [self floatValue]);
    return result;
}
@end

И затем

NSNumber *n = @42.24;
CGFloat f = [n myCGFloatValue];

, но я сомневаюсь, что это стоит того, что нужно.

11
ответ дан Martin R 26 August 2018 в 22:40
поделиться

Более старые ответы верны. Только для моего 2 ¢, вот моя реализация:

@implementation NSNumber (TypeConversion)

- (CGFloat)cgFloatValue
{
#if CGFLOAT_IS_DOUBLE
    return self.doubleValue;
#else
    return self.floatValue;
#endif
}

@end

Это зависит от определения CGFLOAT_IS_DOUBLE в CGBase.h для Objective C или CoreGraphics.h для Swift:

// Don't write this code; it's already included in Foundation :)

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif

typedef CGFLOAT_TYPE CGFloat;
#define CGFLOAT_DEFINED 1

Из CoreGraphics.h

1
ответ дан Ben Leggiero 26 August 2018 в 22:40
поделиться

Просто всегда получайте двойное значение. Если CGFloat - это всего лишь «поплавок» на вашей машине, двойной будет мгновенно усечен, поэтому вам все равно.

4
ответ дан Wil Shipley 26 August 2018 в 22:40
поделиться