Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重新定义宏未按预期工作 我在C++中定义了在特定内存区域中的块。我想定义一个块,然后在为每个块重新定义的变量中定义下一个块的地址 #include <iostream> using namespace std; #define BASE_ADDRESS 0X1000 // type a gets 100 bytes #define TYPE_A BASE_ADDRESS #define NEXT_FREE_BLOCK (BASE_ADDRESS + 100) // type b gets 200 bytes, starting at the next free address #define TYPE_B NEXT_FREE_BLOCK #undef NEXT_FREE_BLOCK #define NEXT_FREE_BLOCK (TYPE_B + 200) // ---end of RWW memory map--- int main() { cout<<"Hello free block " << NEXT_FREE_BLOCK << endl; return 0; } #包括 使用名称空间std; #定义基址0X1000 //类型a得到100字节 #定义一个基本地址的类型 #定义下一个空闲块(基地址+100) //类型b从下一个空闲地址开始获得200字节 #定义类型B下一个自由块 #取消定义下一个空闲块 #定义下一个\u空闲\u块(类型\u B+200) //---RWW内存映射结束--- int main() { cout_C++_Preprocessor - Fatal编程技术网

重新定义宏未按预期工作 我在C++中定义了在特定内存区域中的块。我想定义一个块,然后在为每个块重新定义的变量中定义下一个块的地址 #include <iostream> using namespace std; #define BASE_ADDRESS 0X1000 // type a gets 100 bytes #define TYPE_A BASE_ADDRESS #define NEXT_FREE_BLOCK (BASE_ADDRESS + 100) // type b gets 200 bytes, starting at the next free address #define TYPE_B NEXT_FREE_BLOCK #undef NEXT_FREE_BLOCK #define NEXT_FREE_BLOCK (TYPE_B + 200) // ---end of RWW memory map--- int main() { cout<<"Hello free block " << NEXT_FREE_BLOCK << endl; return 0; } #包括 使用名称空间std; #定义基址0X1000 //类型a得到100字节 #定义一个基本地址的类型 #定义下一个空闲块(基地址+100) //类型b从下一个空闲地址开始获得200字节 #定义类型B下一个自由块 #取消定义下一个空闲块 #定义下一个\u空闲\u块(类型\u B+200) //---RWW内存映射结束--- int main() { cout

重新定义宏未按预期工作 我在C++中定义了在特定内存区域中的块。我想定义一个块,然后在为每个块重新定义的变量中定义下一个块的地址 #include <iostream> using namespace std; #define BASE_ADDRESS 0X1000 // type a gets 100 bytes #define TYPE_A BASE_ADDRESS #define NEXT_FREE_BLOCK (BASE_ADDRESS + 100) // type b gets 200 bytes, starting at the next free address #define TYPE_B NEXT_FREE_BLOCK #undef NEXT_FREE_BLOCK #define NEXT_FREE_BLOCK (TYPE_B + 200) // ---end of RWW memory map--- int main() { cout<<"Hello free block " << NEXT_FREE_BLOCK << endl; return 0; } #包括 使用名称空间std; #定义基址0X1000 //类型a得到100字节 #定义一个基本地址的类型 #定义下一个空闲块(基地址+100) //类型b从下一个空闲地址开始获得200字节 #定义类型B下一个自由块 #取消定义下一个空闲块 #定义下一个\u空闲\u块(类型\u B+200) //---RWW内存映射结束--- int main() { cout,c++,preprocessor,C++,Preprocessor,让我们看看这个例子: #define MYMACRO 0 //MYMACRO = 0 #define ANOTHERMACRO MYMACRO //ANOTHERMACRO = MYMACRO = 0 int main() { return ANOTHERMACRO; } 好的,好吗 但如果我们这样做: #define MYRECURSIVEMACRO 0 //MYRECURSIVEMACRO = 0 #define MYMACRO MYRECURSIVEMACRO //MYMAC

让我们看看这个例子:

#define MYMACRO 0 //MYMACRO = 0
#define ANOTHERMACRO MYMACRO //ANOTHERMACRO = MYMACRO = 0

int main() {
    return ANOTHERMACRO;
}
好的,好吗

但如果我们这样做:

#define MYRECURSIVEMACRO 0 //MYRECURSIVEMACRO = 0

#define MYMACRO MYRECURSIVEMACRO //MYMACRO = MYRECURSIVEMACRO

#undef MYRECURSIVEMACRO // MYRECURSIVEMACRO does not exist
#define MYRECURSIVEMACRO (MYMACRO+10) //What was MYMACRO again? It was MYRECURSIVEMACRO, but now we are setting MYRECURSIVEMACRO, which right now is being defined, to itself plus 10, and now I am 100% confused

#define ANOTHERMACRO MYRECURSIVEMACRO //Now what?

int main() {
    return ANOTHERMACRO;
}
我们得到这个:

1>C:\dev\Stack Overflow\Source.cpp(520,9): error C2065: 'MYMACRO': undeclared identifier
(至少对于MSVC++)

现在,如果我们看看这个:


#define BASE_ADDRESS 0X1000 //BASE_ADDRESS = 0x1000

// type a gets 100 bytes
#define TYPE_A BASE_ADDRESS //TYPE_A = BASE_ADDRESS = 0x1000
#define NEXT_FREE_BLOCK (BASE_ADDRESS + 100) //NEXT_FREE_BLOCK = 0x1000 + 100
    
// type b gets 200 bytes, starting at the next free address
#define TYPE_B NEXT_FREE_BLOCK //TYPE_B = NEXT_FREE_BLOCK
#undef NEXT_FREE_BLOCK //NEXT_FREE_BLOCK is gone
#define NEXT_FREE_BLOCK (TYPE_B + 200) //Now what? Same problem as before!

// ---end of RWW memory map---


这就是它不起作用的原因。

宏不允许递归,如果它们允许的话,你可以使用无限递归。你考虑过使用自定义链接器脚本吗?这些脚本通常让你定义内存段的名称以及它们的位置。在我的脑海中,这听起来有点像你想要实现的东西。
enum
将bably可能是一个简单得多的解决方案。你介意解释一下你打算如何使用
下一个\u FREE\u BLOCK
?。可能有一个更优雅的解决方案,但有点不清楚你想要实现什么。想象更多像问题中所示的类型b这样的情况——我定义了许多块,它们都进入了这个特殊的memory区域。最有可能更改的是每个人使用的结构的大小和存储的结构元素的数量。它还存储从页面边界开始的元素。因此,我希望编译器或预处理器根据我给定的大小计算下一个块的地址,而不是每次手工重新计算。这就是这里用“base_address+100”和“type_b+200”表示的。我终于弄明白了这一点;这是我问题的实际答案。仅仅说“anenum”并不是一个解决方案。

#define BASE_ADDRESS 0X1000 //BASE_ADDRESS = 0x1000

// type a gets 100 bytes
#define TYPE_A BASE_ADDRESS //TYPE_A = BASE_ADDRESS = 0x1000
#define NEXT_FREE_BLOCK (BASE_ADDRESS + 100) //NEXT_FREE_BLOCK = 0x1000 + 100
    
// type b gets 200 bytes, starting at the next free address
#define TYPE_B NEXT_FREE_BLOCK //TYPE_B = NEXT_FREE_BLOCK
#undef NEXT_FREE_BLOCK //NEXT_FREE_BLOCK is gone
#define NEXT_FREE_BLOCK (TYPE_B + 200) //Now what? Same problem as before!

// ---end of RWW memory map---