我在类声明之前定义了一个宏。宏调用类的成员函数。我的示例代码如下。
示例类声明,
// sample.h
#include <sstream>
#include <iostream>
using namespace std;
#define CALCULATETEMP(a, b, c) {
int d = Sample::getTempIncrement(a,b,c);
stringstream ss;
ss << d;
cout << ss.str() << endl;
}
class Sample {
public:
Sample();
int getTempIncrement(int a, int b, int c);
~Sample();
};
示例类实现,
//sample.cpp
#include "sample.h"
Sample::Sample() {
}
int Sample::getTempIncrement(int a, int b, int c) {
int temp = 5;
int d = (a*temp) + (b+c)*temp;
return d;
}
Sample::~Sample() {
}
主要例程,
//main.cpp
#include "sample.h"
int main(int argc, char* argv[]) {
int a = 1;
int b = 2;
int c = 3;
CALCULATETEMP(a, b, c);
return 0;
}
当我运行main.cpp时,我在宏定义中的sample.h文件中收到错误:“Sample”不是类或命名空间名称。
如何在类声明范围之外和类声明之前调用类的成员函数?我对编程很陌生,你的反馈会对我有所帮助,谢谢。
答案 0 :(得分:4)
如果您希望宏跨越多行,则必须将\
放在每行的末尾:
#define CALCULATETEMP(a, b, c) { \
int d = Sample::getTempIncrement(a,b,c); \
stringstream ss; \
ss << d; \
cout << ss.str() << endl; \
}
另外,为什么不直接使用函数(而不使用stringstream
)?
class Sample {
public:
Sample();
int getTempIncrement(int a, int b, int c);
~Sample();
};
void calctemp(int a, int b, int c) {
int d = Sample::getTempIncrement(a,b,c);
stringstream ss;
ss << d;
cout << ss.str() << endl; // why are you using stringstream? It could be
// just cout << d << endl;
}
答案 1 :(得分:2)
我相信还有另一个问题。 Sample :: getTempIncrement()未声明为静态,因此您需要宏中的Sample实例。
答案 2 :(得分:0)
您已将CALCULATETEMP(a,b,c)
定义为由预处理器替换为{
,然后使用一堆全局空间编码进行跟踪,这非常违法。
我建议回到有关预处理器宏的教程和/或阅读内联函数。