我遇到了这个问题,我不知道如何评估它,因为我刚刚开始学习C和gcc。 我创建了一个函数来返回以
null
结尾的字符串数组。字符串以 '\0'
终止,但数组也以 '\0'
终止。这是工作很好,因为它没有在 Ubuntu 上用标志-Wall -Werror -Wextra
警告我,但是当我在 macOS 上尝试它时,它无法编译(expression which evaluates to zero treated as a null pointer constant of type 'char *' [-Werror,-Wnon-literal-null-conversion]
)。
因此,我了解了
'\0'
和 0
(NULL
) 之间的区别以及为什么我应该用 NULL
终止数组。
我的问题是如何在 Ubuntu 上也能捕获它?哪些默认设置造成了它们之间的差异?
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Apple clang version 15.0.0 (clang-1500.1.0.2.5)
macOS 上默认的 gcc 与 linus 上的 gcc 的行为不同,因为它是完全不同的编译器:如
--version
输出所示,macOS 上的 gcc 默认情况下是 clang 的别名。
clang 作为 X-Code 的一部分安装,并支持 gcc 的大部分警告,等等。默认设置有些不同,因此您可能会在 mac 上收到一条警告,提示您无法使用 gcc 在 linux 上获得。
我强烈建议您在 Makefile 中使用 gcc -Wall -Wextra -Werror 启用更多警告,以在编译时捕获许多微妙和不那么微妙的问题。 clang 还支持 -Weverything 但某些额外级别的分析可能有点令人讨厌。