0

そこで、XOR ビット演算子を使用して 2 つの数値を交換するマクロを作成しました。XOR ゲートを使用して数値を交換するアルゴリズムはよく知られています (つまり、a ^= b; b ^= a; a ^= b;) が、マクロを呼び出すときに構文エラーが発生し続けます。どこかにセミコロンが必要だと言っています。

正確なエラー:

Line 73: error C2146: syntax error : missing ';' before identifier 'a'

私のプログラムが問題を抱えているファイルは次のとおりです。

#define swapNumbers(x, y, z) z = x, x = y, y = z;
#define swapStrings(str1, str2, str3)  str3 = str1, str1 = str2, str2 = str3;
#define swapUsingXOR (a, b) a = a ^ b, b = b ^ a, a = a ^ b;


#include <iostream>
#include "protocol.h"
#include <string>

void PrintMenu()
{
std::cout << "\n\nChapter 16 -- Learn By Doings " << std::endl;
std::cout << "\n1. Learn By Doing 16.4 " << std::endl;
std::cout << "2. Learn By Doing 16.5 " << std::endl;
std::cout << "3. Learn By Doing 16.6 " << std::endl;
std::cout << "4. Exit " << std::endl;
NewLine();
}

void GetMenuChoice(int &menuChoice)
{
std::cin >> menuChoice;
}

void ExecuteMenuChoice(int &menuChoice)
{
switch(menuChoice)
{
case 1:
    {
        //Learn By Doing 16.4

        //Swap two numbers
        int x = 10;
        int y = 20;
        int z = 30;

        std::cout << "\nBefore swapping x is " << x << " and y is " << y << std::endl;
        swapNumbers(x, y, z);
        std::cout << "After swapping x is " << x << " and y is " << y << std::endl; 
        NewLine();

        //Swap two cStrings
        char * firstName = "Magnus";
        char * lastName = "Carlsen";
        char * tempName = "GOAT";

        std::cout << "\nBefore swapping, first name is " << firstName << " and last name is " << lastName << std::endl;
        swapStrings(firstName, lastName, tempName);
        std::cout << "After swapping, first name is " << firstName << " and last name is " << lastName << std::endl;

    }
    break;
case 2:
    //Learn By Doing 16.5
    {

    int x = 0;

    //Check if number is power of two
    std::cout << "\nEnter number: " << std::endl;
    std::cin >> x;

    NewLine();
    std::cout << ChangeBoolToString(isPowerOfTwo(x));

    //Swap numbers using bitwise operations
    NewLine();
    int a = 666;
    int b = 777;

    std::cout << "\n\nBefore swapping a is " << a << " and b is " << b << std::endl;
    swapUsingXOR(a, b);
    std::cout << "After swapping a is " << a << " and b is " << b << std::endl;

    }
    break;
case 3:
    //Learn By Doing 16.6

    break;
case 4:
    //Exit
    NewLine();

    break;
default:
    std::cout << "Invalid input.  Please enter a number between 1 and 4. " << std::endl;

}
}

void NewLine()
{
std::cout << ' ' << std::endl;
}

bool isPowerOfTwo(int binaryNumber)
{
while(((binaryNumber & 1) == 0) && binaryNumber > 1)
    binaryNumber >>= 1;

if(binaryNumber == 1)
    return true;
else
    return false;
}

char * ChangeBoolToString(bool function)
{
if(function == true)
    return "Your number is a power of two! ";
else
    return "Your number is not a power of two. ";
}
4

3 に答える 3

4

マクロ定義に余分なスペースがあります:

#define swapUsingXOR (a, b) a = a ^ b, b = b ^ a, a = a ^ b;
                    ^
                    |--- get rid of this space

セミコロンも必要ありません。中かっこを追加したり、do/while(0) トリックを使用して、マクロを単純なステートメントのように動作させたりすることができます。

あなたが初心者なら (そして、あなたがそうであるように見えます)、おそらくclangをチェックしたいと思うでしょう。ほとんどの場合、他のほとんどのコンパイラよりもはるかに役立つエラー メッセージが生成されます。たとえば、マクロを使用したテスト プログラムは次のメッセージを表示します。これにより、何が起こっているかが非常に明確になります。

example.c:14:5: warning: expression result unused [-Wunused-value]
    swapUsingXOR(a, b);
    ^~~~~~~~~~~~
example.c:5:23: note: expanded from macro 'swapUsingXOR'
#define swapUsingXOR (a, b) a = a ^ b, b = b ^ a, a = a ^ b;
                      ^
example.c:14:5: error: expected ';' after expression
    swapUsingXOR(a, b);
    ^
example.c:5:29: note: expanded from macro 'swapUsingXOR'
#define swapUsingXOR (a, b) a = a ^ b, b = b ^ a, a = a ^ b;
                            ^
example.c:14:18: warning: expression result unused [-Wunused-value]
    swapUsingXOR(a, b);
                 ^
example.c:14:5: warning: expression result unused [-Wunused-value]
    swapUsingXOR(a, b);
    ^~~~~~~~~~~~
example.c:5:26: note: expanded from macro 'swapUsingXOR'
#define swapUsingXOR (a, b) a = a ^ b, b = b ^ a, a = a ^ b;
                         ^
example.c:14:21: warning: expression result unused [-Wunused-value]
    swapUsingXOR(a, b);
                    ^
4 warnings and 1 error generated.
于 2013-02-22T22:48:46.103 に答える
1

これはひどいです。それをしません。マクロで同じ引数を複数回参照することは、大惨事のレシピです...あなたのコードがこれをどうするか教えてください:

int *f1(); // function that returns an int pointer.
int *f2(); // function that returns an int pointer.
int x = 666;

// Quick... how many times is each function called? And is that 
// what the programmer expects based on the regular semantics of
// of the language? Are you sure it's safe to call those functions
// multiple times? Will the result be what you think it's going to be?
swapUsingXOR(*f1(), *f2());

// And what happens here?
swapUsingXOR(x, x);
于 2013-02-22T22:57:35.963 に答える
0

詳細を読む#define...

#defineマクロについてはご存知のとおりですが、セミコロン「;」を入れます そこで!isを使用する場合、#define基本的にはプリプロセッサの検索と置換のメモを追加するだけです... で置き換えるswapNumbers(x, y, z)z = x, x = y, y = z;問題が発生します... セミコロン ";" が保持され、エラーが発生します...

たとえば、セミコロンを置くべきではない場所に置くことができswapNumbers(x, y, z);、最後に 2 つになります!

ここでもっと読む:)

于 2013-02-22T22:58:21.620 に答える