这里进行的是哪种显式转换

Which kind of explicit conversion is done here?

本文关键字:显式转换 这里      更新时间:2023-10-16

这是在我的MVS2015中编译和工作的代码:

#define STRING_TEST "Test String"
using namespace std;
void test(char * str) {
    cout << str;
}
int main ()
{
    test(STRING_TEST);
}

我猜STRING_TEST被转换成char[11]。相反,因为我传递它没有&,它创建一个char *指针?或者我错过了什么?

"Test string"的类型是const char[12],而不是char[11](您忘记了'')。

你的代码相当于

test("Test String");

宏只是做一个查找+替换,所以它不是"转换"。

数组衰变成指针,在这里,char数组衰变成char*test这样称呼它。然而,自const char* != char*以来,这已经从c++中删除了。

您的代码中根本没有显式转换。

STRING_TEST是一个宏,所以语句

test(STRING_TEST);

被预处理成

test("Test String");

将被编译。

"Test String"是一个字符串字面值,因此当传递给函数时将隐式转换为const char *

因此,假设您的编译器符合标准,该语句将无法编译(因为不允许从const char *(或从字符串文字到char *)的隐式转换)。

然而,一些编译器确实允许这种隐式转换(出于向后兼容旧版本C的原因)。这些编译器通常可以通过启动诊断(例如,Microsoft编译器添加/Wall命令行选项)来抱怨。