C++遇到的宏和错误

C++ macros and errors encountered

本文关键字:错误 遇到 C++      更新时间:2023-10-16

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

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

附加代码中的宏 mMul 必须设计为将两个十六进制数相乘。由于乘法代码中有更多的过程,我将其缩短为XOR两个十六进制数。

但是编译此代码总是给出编译器错误

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;
}

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

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应该具有哪些类型。

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

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

#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;
}

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

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

不会为库特返回任何东西。此外,"{"会阻碍"cout"重载的流程,结果是编译错误。

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

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

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

并尝试使用 GCC 编译器。

我认为,

#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;
}

圆括号和一些更改将在这里完成工作。

   #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;
    }