带有内存的C++宏
C++ Macro with Memory
这最初是作为带有内存的c++宏的答案发布的?
但不知怎么的,我没能把它整理好。我可能错过了什么。(我有一种感觉,这是C++可以做的事情)
main.cpp
#include <iostream>
using namespace std;
const char * hello = "hello";
const char * world = "world";
#define VAR
#define MEMORIZE world
#include "memorize.h"
#define MEMORIZE hello
#include "memorize.h"
int main() {
cout << VAR << endl;
return 0;
}
记忆.h
#undef VAR
#ifndef MEMORIZE
# error "No Argument to memorize.h"
#endif
#define VAR MEMORIZE
#undef MEMORIZE
我得到的编译错误是:
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
error: use of undeclared identifier 'MEMORIZE'
cout << VAR << endl;
^
note: instantiated from:
#define VAR MEMORIZE
^
1 error generated.
make[2]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2
我真的很想让这个内存在预处理阶段发挥作用。有人能帮忙吗?我认为1.49
中的BOOST_PP_COUNTER
也使用了这种技术,但我不知道如何使用。
您只使用一个VAR
值(最后一个),因为它只能取一个值。如果您希望VAR
根据上下文来表示不同的含义,则需要在每个include之后都有源语句。
#define xstr(a) str(a)
#define str(a) #a
int main() {
#define MEMORIZE world
#include "memorize.h"
cout << VAR << endl;
#undef MEMORIZE
#define MEMORIZE hello
#include "memorize.h"
cout << VAR << endl;
return 0;
}
记忆.h:
#undef VAR
#ifndef MEMORIZE
# error "No Argument to memorize.h"
#endif
#define VAR xstr(MEMORIZE)
您正在将VAR
宏设置为令牌MEMORIZE
,并立即对其进行取消定义。线路:
cout << VAR << endl;
最终为:
cout << MEMORIZE << endl;
并且由于MEMORIZE
是未声明的,所以您会得到错误。它认为MEMORIZE
是一个变量名。
您需要移动#undef MEMORIZE
行--将其从memory.h中取出,并将其放在出现的所有#define MEMORIZE
之前。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存