Bep*_*ppe 3 c arrays string c-preprocessor
我想定义一个像这样的字符串数组:
#define sup (const char**) ("string1", "string2")
Run Code Online (Sandbox Code Playgroud)
但是当我尝试打印第一个字符串时它失败了:
printf("The string: %s\n",sup[0]);
Run Code Online (Sandbox Code Playgroud)
怎么以正确的方式做到这一点?
我建议不要完全使用宏来做这件事,但是如果你真的对代码的内容感兴趣 - 而不是实际应该如何处理它,这里有一个解释.
代码中存在一个简单的问题,而且更加模糊.非常简单的是声明一个数组,你不使用括号,而是使用花括号:
#define sup (const char**){"str1", "str2"} // still wrong!!
Run Code Online (Sandbox Code Playgroud)
不太简单的问题是数组不是指针.花括号初始值设定项可用于初始化两个数组const char*
,但这与a不同const char**
.如果您将代码更改为:
#define sup (const char*[2]){"str1", "str2" }
Run Code Online (Sandbox Code Playgroud)
它应该工作.
以前的版本引擎盖下发生了什么?好吧,编译器正在看到指针的声明(好吧,转换为指针)和初始化器.假设你想要用第一个元素初始化指针(不兼容的指针,但是强制转换是显式的......你必须知道你强制转换时你想要什么),然后忽略余数.基本上编译器会将您的代码转换为[*]:
#define sup (const char**)"str1"
Run Code Online (Sandbox Code Playgroud)
这将在运行时造成破坏.有趣的是,如果你使用了一个合适的变量,然后用它初始化了指针,它就会起作用,因为虽然数组不是指针(我坚持,记住这一点)数组会衰减成指针:
const char* tmp[] = { "hi", "there" };
const char** sup = tmp; // fine, tmp decays into &tmp[0]
Run Code Online (Sandbox Code Playgroud)
[*]那里有一些handwaving ...编译器翻译代码,一旦插入到预处理器的宏使用位置,但翻译等同于我手动编辑宏时所写的内容.