我正在使用程序验证某些结果,我想用宏替换我的函数调用以加快验证过程。
但是,我最初尝试用宏替换简单函数总是导致编译器错误。
附加代码中的宏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;
}
答案 0 :(得分:1)
宏扩展后(记住宏只是编译前发生的文本替换),代码是:
cout << { uint8_t prod = 0x00; prod = a^b; };
这是一个语法错误。要解决此问题,您可以使用正确的lambda语法。然而,使用函数似乎更好的风格:
inline uint8_t mMul(int a, int b)
{
return a ^ b;
}
请注意,这将输出字符值(不是整数值),因为uint8_t
是unsigned char
的typedef。要获得整数值,您可以让函数返回uint16_t
,或者可以编写cout << static_cast<unsigned int>( mMul(a,b) );
。此外,我会更多地考虑a
和b
应具有的类型。
答案 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;
}