回答你的问题最好的方法是将其重写为一个程序,当使用“C”或“C ++”编译器时编译结果相同。我假设你正在使用GCC,但其他(正确编写的)编译器工具链应该提供类似的结果。
首先,我将解决你提出的每个问题,然后给出一个程序来提供答案(和证明)。
- 据我所知,在C++11之前,字符串字面值在C和C ++之间的处理方式几乎完全相同。
它们仍然可以使用各种命令行参数以相同的方式处理,在此示例中,我将使用“-fpermissive”(作弊)。您最好找出为什么会收到警告并编写新代码以避免任何警告;只使用CLP“作弊”来编译旧代码。
编写新代码时要正确无误(没有作弊和没有警告,不用说没有错误)。
- 现在,我承认在处理宽字符串字面值方面,C和C ++之间存在差异。
在不同的情况下,你可以通过作弊来消除大部分或全部差异,因此它们之间并没有太大区别。作弊是错误的,要学会正确编程并遵循现代标准,而不是过去的错误或笨拙方式。有些事情是按照一定方式完成的,这样对你和编译器都有帮助(记住,你不是唯一一个“看到”你的代码的人)。
在这种情况下,编译器需要足够的空间来用'0'(零字节)终止字符串。这允许使用打印(和其他一些)函数而无需指定字符串的长度。
如果你只是想编译从某个地方获取的现有程序,并且不想重新编写它,只是想编译并运行它,那么使用作弊(如果必须)来跳过警告并将编译强制转换为可执行文件。
不行。
.
请看这个示例程序。我稍微修改了你的问题,将其变成了一个程序。使用“C”或“C ++”编译器编译此程序的结果是相同的。
将下面的示例程序文本复制并粘贴到名为“test.c”的文件中,然后按照开头的说明操作。只需使用“cat”命令打开文件即可回滚(并查看)它,而无需打开文本编辑器,然后复制并粘贴每行以编译器命令开头的行(接下来的三行)。
请注意,正如评论中指出的那样,使用现代g ++编译器运行此行“g ++ -S -o test_c ++.s test.c”会产生错误,因为容器不足以容纳字符串。
您应该能够阅读此程序,而实际上不需要编译它即可查看答案,但如果您希望这样做,它将编译并生成输出供您检查。
正如您所看到的,当字符串以空字符结尾时,变量“str1”的长度不足以容纳该字符串,在现代(正确编写的)g ++编译器上会产生错误。
/* Answer for: https://dev59.com/p2Ag5IYBdhLWcg3w0Nve
*
* cat test.c
* gcc -S -o test_c.s test.c
* g++ -S -o test_c++.s test.c
* g++ -S -fpermissive -o test_c++.s test.c
*
*/
char str1[3] = "1ab"
char str2[4] = "2ab"
char str3[] = "3ab"
main(){return 0
/* Comment: Executing "g++ -S -o test_c++.s test.c" produces this Error:
*
* test.c:10:16: error: initializer-string for array of chars is too long [-fpermissive]
* char str1[3] = "1ab"
* ^
*
*/
/* Resulting Assembly Language Output */
/* .file "test.c"
* .globl _str1
* .data
* _str1:
* .ascii "1ab"
* .globl _str2
* _str2:
* .ascii "2ab\0"
* .globl _str3
* _str3:
* .ascii "3ab\0"
* .def ___main
* .text
* .globl _main
* .def _main
* _main:
* LFB0:
* .cfi_startproc
* pushl %ebp
* .cfi_def_cfa_offset 8
* .cfi_offset 5, -8
* movl %esp, %ebp
* .cfi_def_cfa_register 5
* andl $-16, %esp
* call ___main
* movl $0, %eax
* leave
* .cfi_restore 5
* .cfi_def_cfa 4, 4
* ret
* .cfi_endproc
* LFE0:
* .ident "GCC: (GNU) 4.8.2"
*
*/
const char[N]
和char[N]
的区别非常大。C++禁止修改字符串字面量的规则也禁止修改const
对象。你不会发现任何C++特殊情况,就像C规则明确禁止写入存储字符串字面量的内存那样。 - Ben Voigtchar str[4] = "abc";
不是赋值,而是初始化。 - Yu Haochar
数组的问题,而不是字符串字面值的问题。 - tenfour