这是在我的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 *指针?或者我错过了什么?
答案 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
命令行选项)。