Chr*_*hey 11 c compiler-construction macos linker gcc
经过多年的编程,我正在修课.我的导师没有使用POSIX机器,最近我因index
在作业中使用该功能而受到处罚.我做了一些研究,我注意到虽然它index
是AT&T Unix的早期部分并且符合POSIX标准,但它不是C99标准的一部分.我希望gcc帮我找到类似符号的用法.我正在使用gcc 4.2(不是 llvm)编译OSX
我的第一站研究涉及注意我的string.h文件包含原型,用于index
以下检查功能测试宏:
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
Run Code Online (Sandbox Code Playgroud)
经过一番挖掘后,我发现了这个(在我看来/usr/include/sys/cdefs.h
):
/* STRICT Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the
* available APIs to exactly the set of APIs defined by the
* corresponding standard, based on the value defined.
*
* A correct, portable definition for _POSIX_C_SOURCE is 200112L.
* A correct, portable definition for _XOPEN_SOURCE is 600L.
*/
Run Code Online (Sandbox Code Playgroud)
所以使用这个gcc命令:
gcc -D _POSIX_C_SOURCE=200112L -pedantic -Wall -std=c99 -o myExec ./mySource.c
Run Code Online (Sandbox Code Playgroud)
我做得到一个体面的警告:
warning: incompatible implicit declaration of built-in function ‘index’
Run Code Online (Sandbox Code Playgroud)
这混淆了我,并且我想使程序无法和链接.它让我困惑的原因是,我在opengroup.org上读到,定义该宏应该暴露 POSIX符号,而不是隐藏它们.所以这是我的问题,简洁的形式:
如何制作gcc 4.2(在OSX 10.6上)在一个严格的 C99 环境中编译和链接我的程序,没有其他符号可用?
理想情况下,我希望在编译期间发出警告并且无法链接.我希望答案不涉及告诉gcc我正在编写POSIX代码,当我认为这与我想说的相反时.我不明白的是什么?
Die*_*Epp 11
抱歉,你不会收到链接错误.图书馆不这样做.该index
函数是标准库的一部分.标准库同时支持多个版本的C(和POSIX),宏选择暴露哪些原型.
该-ansi
标志等同于-std=c89
,所以停止这样做.
您是正确的,它_POSIX_C_SOURCE
公开了其他功能,但它也指定了要公开的功能版本.定义_POSIX_C_SOURCE=200112L
意味着index
出现<strings.h>
而不是<string.h>
.它还在那里.指定2008 POSIX将index
完全摆脱,因为它已从更高版本的POSIX标准中删除.
还有是,这意味着"仅ANSI C"的宏,那就是_ANSI_SOURCE
.
您可以通过添加来获取编译错误(但不是链接错误)-Werror-implicit-function-declaration
.
$ gcc -Werror-implicit-function-declaration \ -D_ANSI_SOURCE -pedantic -Wall -std=c99 ... error: implicit declaration of function 'index'
这似乎适用于OS X 10.5/10.8,GCC 4.0/4.2的所有组合.
归档时间: |
|
查看次数: |
2993 次 |
最近记录: |