为什么表达式 strlen(cstr1) 没有计算为常量,其中 cstr1 是一个 const char 数组?
Why the expression strlen(cstr1) did not evaluate to a constant, where cstr1 is a const char array?
当我构建以下代码时,编译器说表达式未计算为常量。但我不知道如何修复错误。有人可以帮忙吗?
#include <iostream>
#include <cstring>
const char cstr1[] = "Hello";
const char cstr2[] = "world!";
int main()
{
constexpr size_t new_size = strlen(cstr1) + strlen(" ") + strlen(cstr2) + 1;
char cstr3[new_size];
strcpy(cstr3, cstr1);
strcat(cstr3, " ");
strcat(cstr3, cstr2);
std::cout << cstr3 << std::endl;
}
它不起作用,因为 strlen
未声明 [=12=],因此它的结果不能用于 constexpr
。
您可以尝试使用 sizeof
来解决这个问题,但实际上您一开始就不应该使用 C 风格的字符串。 C++ 有 std::string
是有原因的:
const std::string str1 = "Hello";
const std::string str2 = "world!";
int main(){
std::string str3 = str1 + ' ' + str2;
std::cout << str3 << std::endl;
}
标准说strlen
是真正的函数,编译器不知道它做了什么,也不是constexpr
类型的函数(毕竟是一模一样的)如果您使用 fgets
从文件或终端读取输入,则调用该函数)。
许多现代编译器确实理解 strlen
的作用,因此在这种情况下,编译器将优化对函数的调用并将其替换为常量。但是,在标准中不需要以这种方式运行,因此它是否在特定编译器中工作完全取决于该特定编译器(以及可能启用某种类型优化的编译器选项!)
strlen()
是在 运行 时计算的函数,而不是编译时。因此出现错误消息。它是从C继承的,所以没有声明constexpr
(这是C++以后版本特有的)。
最好避免使用 <cstring>
- 和 char
的数组 - 并使用 <string>
中声明的 std::string
类型
#include <iostream>
#include <string>
const std::string cstr1 = "Hello";
const std::string cstr2 = "world!";
int main()
{
std::string cstr3 = cstr1 + std::string(" ") + cstr2;
std::cout << cstr3 << std::endl;
}
当我构建以下代码时,编译器说表达式未计算为常量。但我不知道如何修复错误。有人可以帮忙吗?
#include <iostream>
#include <cstring>
const char cstr1[] = "Hello";
const char cstr2[] = "world!";
int main()
{
constexpr size_t new_size = strlen(cstr1) + strlen(" ") + strlen(cstr2) + 1;
char cstr3[new_size];
strcpy(cstr3, cstr1);
strcat(cstr3, " ");
strcat(cstr3, cstr2);
std::cout << cstr3 << std::endl;
}
它不起作用,因为 strlen
未声明 [=12=],因此它的结果不能用于 constexpr
。
您可以尝试使用 sizeof
来解决这个问题,但实际上您一开始就不应该使用 C 风格的字符串。 C++ 有 std::string
是有原因的:
const std::string str1 = "Hello";
const std::string str2 = "world!";
int main(){
std::string str3 = str1 + ' ' + str2;
std::cout << str3 << std::endl;
}
标准说strlen
是真正的函数,编译器不知道它做了什么,也不是constexpr
类型的函数(毕竟是一模一样的)如果您使用 fgets
从文件或终端读取输入,则调用该函数)。
许多现代编译器确实理解 strlen
的作用,因此在这种情况下,编译器将优化对函数的调用并将其替换为常量。但是,在标准中不需要以这种方式运行,因此它是否在特定编译器中工作完全取决于该特定编译器(以及可能启用某种类型优化的编译器选项!)
strlen()
是在 运行 时计算的函数,而不是编译时。因此出现错误消息。它是从C继承的,所以没有声明constexpr
(这是C++以后版本特有的)。
最好避免使用 <cstring>
- 和 char
的数组 - 并使用 <string>
std::string
类型
#include <iostream>
#include <string>
const std::string cstr1 = "Hello";
const std::string cstr2 = "world!";
int main()
{
std::string cstr3 = cstr1 + std::string(" ") + cstr2;
std::cout << cstr3 << std::endl;
}