C89,混合变量声明和代码

标签 c visual-c++ gcc c89

我很好奇,当您尝试混合变量声明和代码时,为什么 C89 编译器会向您倾倒,例如:

rutski@imac:~$ cat test.c
#include <stdio.h>

int
main(void)
{
    printf("Hello World!\n");
    int x = 7;
    printf("%d!\n", x);
    return 0;
}
rutski@imac:~$ gcc -std=c89 -pedantic test.c
test.c: In function ‘main’:
test.c:7: warning: ISO C90 forbids mixed declarations and code
rutski@imac:~$ 

是的,你可以通过远离 -pedantic 来避免这种事情。但是你的代码不再符合标准。正如任何能够回答这篇文章的人可能已经知道的那样,这不仅仅是一个理论上的问题。像 Microsoft 的 C 编译器这样的平台在任何和所有情况下都在标准中强制执行此快速。

考虑到 C 语言的古老程度,我认为此功能是由于某些历史问题引起的,可追溯到 70 年代非凡的硬件限制,但我不知道细节。还是我完全错了?

最佳答案

C 标准说“你不应该”,因为在 C89 标准标准化的早期 C 编译器中不允许这样做。创建一种可用于编写操作系统及其实用程序的语言是一个足够激进的步骤。这个概念可能根本没有被考虑——当时没有其他语言允许它(Pascal、Algol、PL/1、Fortran、COBOL),所以 C 也不需要。这可能会使编译器稍微难以处理(更大),并且原始编译器的空间受限于 PDP 11 中允许的 64 KiB 代码和 64 KiB 数据空间。系列(大机器;小机器只允许 64 KiB 用于代码和数据,AFAIK)。因此,额外的复杂性不是一个好主意。

是 C++ 允许声明和变量交错,但 C++ 不是,也从来不是 C。但是,C99 终于 catch 了 C++(这是一个有用的特性)。遗憾的是,Microsoft 从未实现 C99。

关于C89,混合变量声明和代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6488503/

相关文章:

c - 将十进制前导零添加到二进制数组 C

您可以将 struct 指针转换为 char 指针吗?

C++代码编译但在运行时失败

visual-studio - 如何在 Visual Studio 2008 中使用 Visual Studio 2010 C++ 工具?

debugging - 是否可以在即时窗口中执行汇编语言指令

c++ - 无法将 std::bind 与可变模板参数一起使用

c++ - C C++内存泄漏的原因

c - 我是否使用了正确的格式说明符?

c++ - OS X 选择 llvm gcc 编译器

c++11 - 使用 c++11 将对存储在 GCC 绳中