预期';'在宣言结束时

时间:2012-04-13 21:44:48

标签: objective-c xcode

我收到以下代码的此错误消息,但它根本没有意义。你能检查一下这段代码并告诉我哪里错了吗?已对相关行中的代码进行了评论。

#import <Foundation/Foundation.h>

typedef struct {
    float exchangeRate;
    double budget;
    double euroTransaction;
} budget;

int main(int argc, const char * argv[])
{
    budget vacationBudget;

    void spendDollars (double dollars) {  //Expected ';' at end of declaration
        vacationBudget.budget -= 100;
    }

    void chargeEuros(double euros) {
        vacationBudget.euroTransaction = euros*vacationBudget.exchangeRate;
        vacationBudget.budget -= vacationBudget.euroTransaction;
    }

    vacationBudget.exchangeRate = 1.2500;
    vacationBudget.budget = 1000.00;
    double numberDollars = 100;
    double numberEuros = 100;

    spendDollars(numberDollars);
    NSLog(@"Converting %.2f US dollars into euros leaves $%.2f", numberDollars, vacationBudget.budget);



    NSLog(@"Charging %.2f euros leaves $%.2f", numberEuros, vacationBudget.budget);

    return 0;
}

5 个答案:

答案 0 :(得分:3)

将spendDollars和chargeEuros函数移到main函数之外。

答案 1 :(得分:2)

功能不能在主内部。改为:

#import <Foundation/Foundation.h>

    typedef struct {
        float exchangeRate;
        double budget;
        double euroTransaction;
    } budget;

budget vacationBudget;

void spendDollars (double dollars) {  //Expected ';' at end of declaration
            vacationBudget.budget -= 100;
    }

    void chargeEuros(double euros) {
            vacationBudget.euroTransaction = euros*vacationBudget.exchangeRate;
            vacationBudget.budget -= vacationBudget.euroTransaction;
    }

    int main(int argc, const char * argv[])
    {

        vacationBudget.exchangeRate = 1.2500;
        vacationBudget.budget = 1000.00;
        double numberDollars = 100;
        double numberEuros = 100;

        spendDollars(numberDollars);
        NSLog(@"Converting %.2f US dollars into euros leaves $%.2f", numberDollars, vacationBudget.budget);



        NSLog(@"Charging %.2f euros leaves $%.2f", numberEuros, vacationBudget.budget);

        return 0;
    }

答案 2 :(得分:1)

在函数中拥有一个函数并不是一个好主意(因为它不会编译 - 即你正在看到的东西 - 它没有逻辑意义),移动花费美元并改变欧元在main之外,并将vacationBudget作为参数传递

答案 3 :(得分:1)

那是因为你在另一个内部定义一个函数(spendDollars) 功能(main)。不允许使用嵌套函数,它们总是“全局” 从那个意义上说。

但是,您可以在另一个内部声明一个函数,然后 充当编译器的线索:该函数在其他地方声明,但现在它 知道参数和返回类型(如果使用,则默认为int 未声明的功能)。

那么,编译器会在另一个函数中看到函数语法 期望它是一个声明,就像函数签名一样。然后呢 当声明结束时,看到左大括号并产生错误 在下一个区块之前没有分号。

您需要将功能spendDollarschargeEuros移到外面 main,因此您必须传递对局部变量的引用 你想修改。这些应该有效:

void spendDollars (budget *b, double dollars)
{
    b->budget -= 100;
}

void chargeEuros(budget *b, double euros) {
    b->euroTransaction = euros*vacationBudget.exchangeRate;
    b->budget -= vacationBudget.euroTransaction;
}

请注意,->运算符将直接在指针上工作,就像是 你用过了

(*b).budget -= 100;

取消引用指针并对结构进行操作。打电话给你的新功能 如

spendDollars(&vacationBudget, numberDollars);

答案 4 :(得分:0)

您的功能spendDollarschargeEuros不能在主要内容。

但是你不能在方法中创建方法。在iOS 4.0中你可以创建块。

有关更多信息,请参阅this有关块的教程