gpt4 book ai didi

c++ - 为什么此代码会出现 'expression syntax' 错误?

转载 作者:太空宇宙 更新时间:2023-11-04 15:21:30 26 4
gpt4 key购买 nike

为什么会报错

Expression Syntax

在下面代码的 m[0]= 行?

struct menu{
int code;
char name[30];
}m[5];

int main() {
clrscr();
m[0]={1,"MAGGI"}; //try to check whether this works or not and it didn't actually
<<endl;
cout<<m[0].code<<"\t"<<m[0].name;
getch();
return 0;
}

最佳答案

简而言之——你不能在 C++ 中用 struct menu 做到这一点仅使用默认构造函数编写。

在 C99 中,您可以使用:

m[0] = (struct menu){ 1, "MAGGI" };  // C99 compound literal

即使在 C++11 中,那(意思是“使用复合文字”)也是无效的。


endl; 的简单使用试图生成一个函数指针,但该函数已过载,因此无法编译。您应该添加 << endl不过,到输出的末尾。


G++ 允许 C99 风格的复合文字

有趣的是,GCC(在 Mac OS X 10.8.4 上测试的 GCC 4.7.1)接受复合文字符号,即使有严格的警告,但这是对标准 C++ 的 GCC/G++ 扩展:

g++ -O3 -g -Wall -Wextra -c x91.cpp

代码:

#include <iostream>
using namespace std;

struct menu
{
int code;
char name[30];
} m[5];

int main()
{
m[0] = (struct menu){ 1, "MAGGI" };
cout << m[0].code << "\t" << m[0].name << endl;
return 0;
}

你必须相当努力地激怒 G++ 才能让它提示:

$ g++ -O3 -g -Wall -Wextra -std=c++98 -pedantic x91.cpp -o x91  
x91.cpp: In function ‘int main()’:
x91.cpp:11:34: warning: ISO C++ forbids compound-literals [-pedantic]
$ g++ -O3 -g -Wall -Wextra -std=c++11 -pedantic x91.cpp -o x91
x91.cpp: In function ‘int main()’:
x91.cpp:11:34: warning: ISO C++ forbids compound-literals [-pedantic]
$

C++ 2011 和“列表初始化”或“扩展初始化列表”

我认为第 8.5 节的一般初始化器和特别是 8.5.4 列表初始化意味着如果您的类(示例中的结构)具有适当的支持,您实际上可以编写您最初拥有的内容。

考虑原始代码的这个小变体:

#include <iostream>
#include <cstring>
using namespace std;

struct menu
{
int code;
char name[30];
menu(int c, const char *n) : code(c) { strncpy(name, n, sizeof(name)); name[sizeof(name)-1] = '\0'; }
menu() : code(0) { name[0] = '\0'; }
} m[5];

int main()
{
menu m0 = { 2, "MAGGI 2" };
m[0] = (struct menu){ 1, "MAGGI 1" };
m[1] = { 3, "MAGGI 3" };
cout << m[0].code << "\t" << m[0].name << endl;
cout << m0.code << "\t" << m0.name << endl;
cout << m[1].code << "\t" << m[1].name << endl;
return 0;
}

此代码在 G++ 下编译正常,但会出现有关复合文字不是标准 C++ 一部分的警告,当编译时如下所示:

$ g++ -O3 -g -Wall -Wextra -std=c++11 -pedantic x91.cpp -o x91  
x91.cpp: In function ‘int main()’:
x91.cpp:16:39: warning: ISO C++ forbids compound-literals [-pedantic]
$ ./x91
1 MAGGI 1
2 MAGGI 2
3 MAGGI 3
$

我们可以讨论使用 strncpy() 的智慧。 ——这与正在讨论的主题无关。需要默认构造函数来允许定义数组。另一个构造函数是扩展列表初始化所必需的。注释掉非默认构造函数,您会得到大量编译消息:

$ g++ -O3 -g -Wall -Wextra -std=c++11 -pedantic x91.cpp -o x91
x91.cpp: In function ‘int main()’:
x91.cpp:15:29: error: could not convert ‘{2, "MAGGI 2"}’ from ‘<brace-enclosed initializer list>’ to ‘menu’
x91.cpp:16:39: warning: ISO C++ forbids compound-literals [-pedantic]
x91.cpp:16:39: error: no matching function for call to ‘menu::menu(<brace-enclosed initializer list>)’
x91.cpp:16:39: note: candidates are:
x91.cpp:10:5: note: menu::menu()
x91.cpp:10:5: note: candidate expects 0 arguments, 2 provided
x91.cpp:5:8: note: constexpr menu::menu(const menu&)
x91.cpp:5:8: note: candidate expects 1 argument, 2 provided
x91.cpp:5:8: note: constexpr menu::menu(menu&&)
x91.cpp:5:8: note: candidate expects 1 argument, 2 provided
x91.cpp:17:26: error: no match for ‘operator=’ in ‘m[1] = {3, "MAGGI 3"}’
x91.cpp:17:26: note: candidates are:
x91.cpp:5:8: note: menu& menu::operator=(const menu&)
x91.cpp:5:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const menu&’
x91.cpp:5:8: note: menu& menu::operator=(menu&&)
x91.cpp:5:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘menu&&’
$

在 C++98 模式下(两个构造函数都存在),您会收到关于在 C++11 兼容模式之外使用“扩展初始化列表”的警告:

$ g++ -O3 -g   -Wall -Wextra -std=c++98 -pedantic x91.cpp -o x91  
x91.cpp: In function ‘int main()’:
x91.cpp:15:29: error: in C++98 ‘m0’ must be initialized by constructor, not by ‘{...}’
x91.cpp:16:39: warning: ISO C++ forbids compound-literals [-pedantic]
x91.cpp:17:26: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
$

关于c++ - 为什么此代码会出现 'expression syntax' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com