【发布时间】:2017-09-18 14:59:41
【问题描述】:
我正在尝试编写一些需要compile on solaris in c99 mode 的C99 代码,但我无法访问solaris 机器。相反,我尝试在 OSX 上使用clang 执行此操作。但是,使用(文件 min.c):
#include <stdio.h>
#include <string.h>
int main() {
printf("%d\n", (int) strnlen("hello world", 5));
return 0;
}
我没有收到关于 strnlen 的任何错误或警告
$ clang -std=c99 -pedantic-errors -Wall -Wextra min.c
$ ./a.out
5
即使strnlen is a 2008 posix extension.
这与:
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
有什么方法可以让clang 严格符合 c99,以便我有更好的机会在 solaris 上进行移植?
【问题讨论】:
-
符合并不意味着你不能使用任何你想要的功能。你在库中有它,你在
h文件中有原型,所以编译和链接没有任何警告是 100% 的。 -
有道理,我想我需要在与 (solaris) 存在兼容性问题的机器上建立同一个库。
-
@PeterJ_01--
strnlen()不是标准库的一部分,尽管strnlen_s()在附件 K 中。标准说 "a strictly conforming program shall use only those features of the language and library specified in this International Standard." -
@David Bowling 这是本文档中的废话之一。它实际上不允许使用任何(甚至是您为特定项目编写的)库。您可以自己编写具有任何名称的任何函数。如果您在程序中写
strnlen(),您认为编译器应该产生错误或警告?当然不是。 -
@PeterJ_01:严格来说,不存在符合标准的编译器或符合标准的库。编译器和库是可以构成一致实现的两个组件。这两个组件不仅必须正确,还必须正确协同工作。