C++遇到的宏和错误
C++ macros and errors encountered
我正在使用一个程序来验证某些结果,我想用宏替换我的函数调用以加快验证过程。
但是,我最初尝试用宏替换简单函数总是导致编译器错误。
附加代码中的宏 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_t
是 unsigned char
的 typedef。要获取整数值,您可以让函数返回 uint16_t
,也可以编写cout << static_cast<unsigned int>( mMul(a,b) );
。此外,我会更多地考虑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;
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;
}
- 创建结构的数组时遇到分段错误
- 为什么我遇到分段错误?
- 这些是什么样的错误?即使我不在 Linux 上工作,我也遇到了 Linux 错误
- 为什么我在尝试模板时遇到视觉工作室C++错误
- 我在C++中遇到了这个奇怪的编译错误
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 我在 ndk 中构建文件时遇到错误 android.mk
- 我在解决此错误时遇到问题.我正在努力在主函数中传递数组
- C++14 遇到奇怪的"use of deleted function"错误
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 当我尝试在C++中对谷物进行序列化时,我遇到了一个奇怪的错误
- 我们在批处理模式下使用 G++ 时遇到错误
- 我不明白尝试使用字符串作为函数参数时遇到的错误
- 尝试通过多个函数移动数组,但遇到了我不知道如何修复的错误
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 在visual Studio中构建代码时,我遇到错误,.h文件丢失
- 在Cython中使用C库时,我遇到了一个错误
- 错误:遇到非法内存访问