遇到C ++宏和错误

时间:2014-12-10 05:48:14

标签: c++ macros

我正在使用程序验证某些结果,我想用宏替换我的函数调用以加快验证过程。

但是,我最初尝试用宏替换简单函数总是导致编译器错误。

附加代码中的宏mMul必须设计为乘以两个十六进制数。由于乘法代码中有更多的程序,我将它缩短为只有两个十六进制数字。

但编译此代码总是会产生编译错误

In function 'int main()'::
expected primary-expression before '{' token
expected ';' before '{' token

在线' cout<< mMul(a,b)'

我相信我的代码在语法上是正确的。但我只是不明白这个错误告诉我的是什么。

任何有关此代码的帮助/建议以及如何设计合适的宏都将非常感激。

#include <iostream> // for cin and cout
#include <stdint.h> // to define uint8_t

using namespace std;

#define mMul(a,b)   \
{                   \
uint8_t prod = 0x00;\
prod = a^b;         \
}

int main()
{
int a, b;

cin >> hex >> a;
cin >> hex >> b;

cout << mMul(a, b);

cin.get();
cin.get();
return EXIT_SUCCESS;
}

5 个答案:

答案 0 :(得分:1)

宏扩展后(记住宏只是编译前发生的文本替换),代码是:

cout << { uint8_t prod = 0x00; prod = a^b; };

这是一个语法错误。要解决此问题,您可以使用正确的lambda语法。然而,使用函数似乎更好的风格:

inline uint8_t mMul(int a, int b)
{
    return a ^ b;
}

请注意,这将输出字符值(不是整数值),因为uint8_tunsigned char的typedef。要获得整数值,您可以让函数返回uint16_t,或者可以编写cout << static_cast<unsigned int>( mMul(a,b) );。此外,我会更多地考虑ab应具有的类型。

答案 1 :(得分:0)

您不能简单地用宏替换函数调用,尤其是涉及返回值时。

在您的情况下,要么必须用其他(诊断)功能替换功能,要么对宏和代码进行以下更改。

#include <iostream> // for cin and cout
#include <stdint.h> // to define uint8_t

using namespace std;


#define mMul(a, b)\
uint8_t prod = 0x00;\
prod = a^b;\
cout << prod; // cout should be here.

int main()
{
int a, b;

cin >> hex >> a;
cin >> hex >> b;

mMul(a, b); // cout is removed from this line.

cin.get();
cin.get();
return EXIT_SUCCESS;
}

答案 2 :(得分:0)

我想,

#include <iostream> // for cin and cout
#include <stdint.h> // to define uint8_t

using namespace std;

#define mMul(a,b,c)( c = a^b )

int main()
{
   int a, b, c;
   uint8_t chk;
   cin >> hex >> a;
   cin >> hex >> b;

   chk = mMul(a, b, c);

   cin.get();
   cin.get();
   return EXIT_SUCCESS;
}

圆括号和一些变化将在这里完成。

答案 3 :(得分:0)

宏不是一个函数,而是一个替换。从您的代码中,'cout'(标准输出流)将期望输出流的对象。但宏观

#define mMul(a,b)   \
  {                   \
    uint8_t prod = 0x00;\
    prod = a^b;         \
 }

不会为cout返回任何内容。 '{'也会阻碍'cout'重载的流程,结果就是编译错误。

最好的方法是使用Matt McNabb建议的内联函数,它更智能,你将获得与宏函数相同的结果。

另一种方法是像这样修改宏。

#define mMul(a,b)  ( { uint8_t prod = 0x00; prod = a^b;  prod;} )

并尝试使用GCC编译器。

答案 4 :(得分:-1)

   #include <iostream> // for cin and cout
    #include <stdint.h> // to define uint8_t
    #include <iomanip>
    using namespace std;

    #define mMul(a,b) (a^b)

    int main()
    {
        uint8_t a, b;

        cin >> hex >> a;
        cin >> hex >> b;


        cout<<setiosflags(ios::uppercase) <<"0x"<<hex<< mMul(a, b);

        cin.get();
        cin.get();  
        return EXIT_SUCCESS;
    }