Jim*_*ker 11 linux gcc network-programming c99 gnu99
这是我在Linux上编译的一些代码:
#include <net/if.h>
int main() {
struct ifreq ifr;
}
Run Code Online (Sandbox Code Playgroud)
gcc test.c 很好.
gcc -std=gnu99 test.c 很好.
gcc -std=c99 test.c 失败,出现以下错误:
test.c: In function ‘main’:
test.c:4:16: error: storage size of ‘ifr’ isn’t known
Run Code Online (Sandbox Code Playgroud)
与C99有什么不同,它不喜欢struct ifreqLinux中的定义?
Arj*_*kar 18
这是预处理和GNU C与C99的一系列后果.
首先,net/if.h:
net/if.h 包括 features.hstruct ifreq在#ifdef __USE_MISC块内定义.所以:
__USE_MISC? - 这是BSD和System V常见的东西features.h现在,features.h:
--std=c99默认情况下使用GCC时定义__STRICT_ANSI__(因为这就是C99的内容)features.h,当__STRICT_ANSI__打开时,BSD和System V功能不会启动.即__USE_MISC未定义.备注net/if.h:struct ifreq预处理后甚至不存在!因此,关于存储大小的投诉.
您可以通过以下方式捕捉整个故事:
vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD)
Run Code Online (Sandbox Code Playgroud)
或者以任何其他方式(比如diff --side-by-side)代替它来区分它们vimdiff.
如果你想要干净利地编译它-std=c99,你必须考虑包含_DEFAULT_SOURCE功能测试宏(对于glibc版本> = 2.19;对于较旧的glibc版本,使用_BSD_SOURCE或者_SVID_SOURCE),以便在所提供的功能之上启用所需的功能. C99.
| 归档时间: |
|
| 查看次数: |
4973 次 |
| 最近记录: |