它似乎被优化掉了,因此在较新的GCC(11.3^)中生成了与正常方法相同的汇编,并且与使用char数组的Artyer解决方案(被接受的解决方案)相同。 Godbolt链接:https://godbolt.org/z/9G7b6PT9b 但是,如果启用了-Wextra警告,则解决方案可能会导致warning: missing initializer for member 'foo_t::str' [-Wmissing-field-initializers],但您可以使用-Wno-missing-field-initializers排除它。 顺便说一下,使用stuct时,你必须记住空间是有限的,在很多情况下你可能想在字符串末尾留下尾随零。使用strncpy时,你可以通过添加以下内容来强制:
3条答案
按热度按时间abithluo1#
这是GCC的一个已知错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55227
不幸的是,你要么不使用指定的初始化器,要么为数组使用不同的初始化器:
wvt8vs2t2#
我得到了相同的错误,并处理了
mv my.cpp my.c
您也可以在此链接中找到答案:https://pcbartists.com/firmware/esp32-firmware/designator-outside-aggregate-initializer-solved/
s71maibg3#
我使用
strncpy
(来自<cstring>
),例如:它似乎被优化掉了,因此在较新的GCC(11.3^)中生成了与正常方法相同的汇编,并且与使用
char
数组的Artyer解决方案(被接受的解决方案)相同。Godbolt链接:https://godbolt.org/z/9G7b6PT9b
但是,如果启用了
-Wextra
警告,则解决方案可能会导致warning: missing initializer for member 'foo_t::str' [-Wmissing-field-initializers]
,但您可以使用-Wno-missing-field-initializers
排除它。顺便说一下,使用
stuct
时,你必须记住空间是有限的,在很多情况下你可能想在字符串末尾留下尾随零。使用strncpy
时,你可以通过添加以下内容来强制: