这里进行了哪种显式转换?

时间:2016-09-23 12:34:51

标签: c++ pointers

这是在我的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 *指针?或者我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

您的代码等同于

test("Test String");

宏只是做一个find + replace,所以它没有“转换”。

数组衰减为指针,到此处,char数组衰减为char*。所以test称之为。然而,自const char* != char*以来,这已从C ++中删除。

答案 1 :(得分:2)

您的代码中根本没有明确的转换。

STRING_TEST是一个宏,所以声明

test(STRING_TEST);

被预处理成

test("Test String");

然后将被编译。

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

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

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