【问题标题】:Token is not a valid binary operation in preprocessor subexpression令牌不是预处理器子表达式中的有效二进制操作
【发布时间】:2020-12-11 13:18:25
【问题描述】:

我正在尝试构建一个 react-native IOS 应用程序。我在 Android 上完成了所有工作,但现在我想在 IOS 上进行测试。当我尝试在 xcode 中构建项目时。我在 2 行收到以下错误:

AppDelegate.m 中的第 7 行 Token is not a valid binary operator in a preprocessor subexpression

AppDelegate.m 中的第 30 行 Token is nog a valig binary operator in a preprocessor subexpressio

我的问题是:我该如何解决这个错误?

我的 AppDelegate.m 的内容

#import "AppDelegate.h"

#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>

#if def FB_SONARKIT_ENABLED
#import <FlipperKit/FlipperClient.h>
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>
#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>

static void InitializeFlipper(UIApplication *application) {
  FlipperClient *client = [FlipperClient sharedClient];
  SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
  [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
  [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
  [client addPlugin:[FlipperKitReactPlugin new]];
  [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
  [client start];
}
#endif

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#if def FB_SONARKIT_ENABLED
  InitializeFlipper(application);
#endif

  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"Copaan"
                                            initialProperties:nil];

  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];
  return YES;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}

@end

信息

React-native 版本:0.36.4

反应版本:16.13.1

我尝试过的事情

  • 我已经删除了 ios 文件夹并安装了从与我的项目同名的新 react-nativev 应用中复制了一个新文件夹。
  • 我已尝试使用react-native upgrade 进行升级

【问题讨论】:

  • swift标签是干什么用的?
  • 不确定,stackoverflow 推荐了它,我想这可能与 swift 有关?但我假设这不是因为你的问题。
  • 您的问题中没有 Swift 代码,只有 Objective-C。为什么也用了C++标签,好像也没有涉及到任何C++代码。
  • 和以前一样的答案,我确实删除了不相关的标签。
  • 您的 FB_SONARKIT_ENABLED 预处理器表达式有问题。您需要向我们展示FB_SONARKIT_ENABLED 的定义。可能您没有将其设置为 01 而是其他无法解析的表达式。

标签: ios objective-c react-native cocoapods


【解决方案1】:

应该是#ifdef#if defined 而不是#if def

#if 也是一个有效的预处理器指令,用于测试预处理器表达式是否非零,因此尝试解析表达式 def FB_SONARKIT_ENABLED 并产生错误。

#ifdef 指令采用单个预处理器标记,在本例中为 FB_SONARKIT_ENABLED,并检查是否有任何定义,无论是否有关联值。

还有一个defined 预处理器运算符可用于#if 的表达式中以测试正在定义的令牌。所以你的表达式可以写成:

#ifdef FB_SONARKIT_ENABLED

#if defined(FB_SONARKIT_ENABLED)

#if defined FB_SONARKIT_ENABLED 

第一个可能在人工编写的代码中更常见,defined 运算符倾向于仅用作更大的预处理表达式的一部分。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多