Как устранить ошибки «переопределения перечислителя» из отдельных сред objc - PullRequest
5 голосов
/ 23 марта 2012

В библиотеках мобильных платежей AuthNet и PayPal определен перечислитель ENV_LIVE. Это приводит к ошибкам XCode, как:

Redefinition of enumerator 'ENV_LIVE' ...

В подобных случаях, когда нельзя позволить себе просто изменить исходный код зависимых сред, какие обходные пути доступны в синтаксисе target-c или в конфигурации xcode?

INITIALLY:

#import "PayPal.h"
#import "AuthNet.h"
...
// AuthNet
[AuthNet authNetWithEnvironment:ENV_TEST];

// PayPal
if (STATUS_COMPLETED_SUCCESS == [PayPal initializationStatus]) {
    [PayPal initializeWithAppID:@"APP-XXX" forEnvironment:ENV_SANDBOX];
}

ОБНОВЛЕНИЕ (вот что я в итоге использовал в качестве обходного пути на основе правильного ответа):

#import "PayPal.h"
@class AuthNet;
#import "AuthNetWorkaround.h"
...
[AuthNet authNetWithEnvironment:AUTHNET_ENV_TEST];

extern const int AUTHNET_ENV_LIVE;
extern const int AUTHNET_ENV_TEST;

@interface AuthNetWorkaround : NSObject

@end

#import "AuthNetWorkaround.h"
#import "AuthNet.h"

@implementation AuthNetWorkaround

const int AUTHNET_ENV_LIVE = ENV_LIVE;
const int AUTHNET_ENV_TEST = ENV_TEST;

@end

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Это происходит потому, что оба включения происходят в одном модуле компиляции. Вы можете обойти эту проблему, переместив включение одного из перечислений в отдельную единицу компиляции, за счет того, что значения этого перечислителя не являются константами времени компиляции (фактически они становятся глобальными переменными).

В pp_workaround.h:

extern const int PAYPAL_ENV_LIVE;

In pp_workaround.m:

#import "PayPal.h" // I'm completely making up the name of PayPal's header
// The import of "AuthNet.h" is missing

const int PAYPAL_ENV_LIVE = ENV_LIVE;

Теперь вы можете включить "pp_workaround.h" вместо "PayPal.h" и использовать PAYPAL_ENV_LIVE вместо ENV_LIVE. Не все будет работать одинаково, но ошибка времени компиляции должна исчезнуть.

РЕДАКТИРОВАТЬ Если ваш код позволяет импортировать конфликтующие заголовки только в ваш файл .m, вы можете исправить проблему (вместо того, чтобы обойти ее), поместив код подключения в дополнительный уровень абстракции вашего собственный, как это:

В paypal_init.h:

extern void connect_paypal();

В paypal_init.m:

#import "PayPal.h"
#import "paypal_init.h"

void connect_paypal() {
    // Use ENV_LIVE from PayPal.h here
}

в authnet_init.h:

extern void connect_authnet();

в authnet_init.m:

#import "AuthNet.h"
#import "authnet_init.h"

void connect_authnet() {
    // Use ENV_LIVE from AuthNet.h here
}

В вашем основном файле:

#import "authnet_init.h"
#import "paypal_init.h"

void init() {
    connect_paypal();
    connect_authnet();
}
0 голосов
/ 31 мая 2013

У меня только что была эта ошибка, и очистка перед сборкой устранила проблему для меня.

...