我现在正在学习C ++,并且我有一些问题需要理解为什么这段代码不会使用#g++ -std=c++11 source.cpp
进行编译。实际上,我使用哪个特定标准并不重要,它只是不编译。
#include <iostream>
#include <string>
using namespace std;
int print_a(char array[])
{
for(char c : array)
cout << c;
cout << endl;
return 0;
}
int main(void)
{
char hello[] {"Hello!"};
print_a(hello);
return 0;
}
错误消息:
debian@debian:~/Documents$ g++ -std=c++11 source.cpp
source.cpp: In function ‘int print_a(char*)’:
source.cpp:6:15: error: ‘begin’ was not declared in this scope
for(char c : array)
^
source.cpp:6:15: note: suggested alternatives:
In file included from /usr/include/c++/4.9/bits/basic_string.h:42:0,
from /usr/include/c++/4.9/string:52,
from /usr/include/c++/4.9/bits/locale_classes.h:40,
from /usr/include/c++/4.9/bits/ios_base.h:41,
from /usr/include/c++/4.9/ios:42,
from /usr/include/c++/4.9/ostream:38,
from /usr/include/c++/4.9/iostream:39,
from source.cpp:1:
/usr/include/c++/4.9/initializer_list:89:5: note: ‘std::begin’
begin(initializer_list<_Tp> __ils) noexcept
^
/usr/include/c++/4.9/initializer_list:89:5: note: ‘std::begin’
source.cpp:6:15: error: ‘end’ was not declared in this scope
for(char c : array)
^
source.cpp:6:15: note: suggested alternatives:
In file included from /usr/include/c++/4.9/bits/basic_string.h:42:0,
from /usr/include/c++/4.9/string:52,
from /usr/include/c++/4.9/bits/locale_classes.h:40,
from /usr/include/c++/4.9/bits/ios_base.h:41,
from /usr/include/c++/4.9/ios:42,
from /usr/include/c++/4.9/ostream:38,
from /usr/include/c++/4.9/iostream:39,
from source.cpp:1:
/usr/include/c++/4.9/initializer_list:99:5: note: ‘std::end’
end(initializer_list<_Tp> __ils) noexcept
^
/usr/include/c++/4.9/initializer_list:99:5: note: ‘std::end’
答案 0 :(得分:8)
它不编译的原因是在C ++中,char array[]
等函数参数调整到char* array
。你的功能看起来很像
int print_a(char* array)
{
....
}
并且基于范围的循环不能处理指针。
一种解决方案是通过引用传递数组。 C ++不允许您按值传递普通数组。例如,这将接受5 char
s:
int print_a(const char (& array)[5])
{
for(char c : array) cout << c;
cout << endl;
return 42;
}
为了将其推广到不同大小的数组,您可以使用模板:
template <std::size_t N>
int print_a(const char (& array)[N])
{
for(char c : array) cout << c;
cout << endl;
return 42;
}
当然,有更简单的方法来打印以null结尾的字符串:
char hello[] {"Hello!"};
cout << hello << endl;
还有标准的库类型可以更容易地传递字符串或char缓冲区对象。例如,std::string
,std::vector<char>
,std::array<char, N>
(其中N
是编译时常量。)
答案 1 :(得分:4)
这里
int print_a(char array[])
{
for(char c : array)
cout << c;
cout << endl;
return 0;
}
数组被衰减到pointer
,因为当你传递一个数组值时,你究竟在做什么来将指针传递给数组的第一个元素,并且基于范围的循环无法使用指针,因此你得到的错误。
See this了解数组如何衰减以及解决方案是什么。
您需要使用按引用传递或指针。
答案 2 :(得分:4)
当您将数组传递给函数时,它会“衰减”到指针。正如在函数中看起来像这样:int print_a(char *array) {...}
您正在使用的循环类型(称为范围循环)无法处理指针,这是错误的来源(尝试迭代指针是没有意义的。)
您必须通过引用传递数组,或者只使用常规for循环。
老实说,如果您使用的是C ++,请使用C ++。使用std::string, or std::vector
。