我建议不要完全使用宏来完成此操作,但如果您真的对代码中发生的事情感兴趣——而不是如何实际解决这个问题,那么这里有一个解释。
代码中存在一个简单的问题和一个更加隐晦的问题。非常简单的问题是,声明数组时不使用括号,而是使用花括号:
```c++
int array[] = {1, 2, 3};
```
而不是
```c++
int array() = {1, 2, 3}; // 这是错误的
```
更难理解的问题是,宏会在编译时展开,因此您不能将它们用于需要在运行时分配内存的操作。
#define sup (const char**){"str1", "str2"} // still wrong!!
较为复杂的问题是数组不是指针。花括号初始化程序可用于初始化两个const char*
的数组,但这与const char**
不同。如果更改代码如下:
#define sup (const char*[2]){"str1", "str2" }
它应该可以工作。
上一个版本的内部是怎么样的?编译器看到了一个指针的声明(其实是一个强制转换为指针),和初始化程序。它假设你想要用第一个元素来初始化指针(不兼容的指针,但是强制转换是明确的...如果你强制转换,你必须知道你想要什么),然后忽略剩余的内容。基本上,编译器将您的代码翻译成[*]:
#define sup (const char**)"str1"
这将在运行时造成混乱。需要注意的是,如果您使用了正确的变量并用它初始化指针,那么它将起作用,因为虽然数组不是指针(请记住这一点),但数组会衰变为指针:
const char* tmp[] = { "hi", "there" };
const char** sup = tmp; // fine, tmp decays into &tmp[0]
[*] 这里有些概念性的东西......编译器会在宏被预处理器插入到使用处时翻译代码,但如果你手动编辑宏,这种翻译相当于我所写的内容。
#define sup (const char*[2]){"str1", "str2" }
,当我执行printf("String: %s\n",sup[0]);
时,会出现以下错误:"error C2059: syntax error : '{' "。 - Beppe