0

I have the following code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char buf[256];

    printf("\nString - Enter your string: ");
    scanf ("%s", buf);

    char *_S = buf;

     .....

}

defining char *_S = buf; in the middle of the code could generate compilation error in some CXX versions

What version of CXX this could generate error. and are there some option to add to the gcc command in order to avoid this error?

EDIT:

I tried with the following option and I did not get any error:

$ gcc -std=c99 -o test test.c
$ gcc -std=c90 -o test test.c
$ gcc -std=c89 -o test test.c
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=i386-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/i386-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/i386-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) 
$
4

4 回答 4

0

您需要告诉 GCC 构建为C90 或更早版本

$ gcc -std=c90 mycode.c
于 2013-01-07T14:56:45.620 回答
0

为避免该错误,请编译为-std=c99或 - std=c11

默认情况下,GCC 使用“非标准 GNU goo”,在过去 10 年左右发布的任何 GCC 版本中,它通常会默认使用类似于 C99 的内容。这意味着默认情况下,GCC 不应该给你一个错误。

于 2013-01-07T14:59:47.980 回答
0

C99 是第一个允许在块的第一个非声明语句之后声明局部变量的标准版本。

因此,如果您传递-std=c99给 gcc,它将接受您的代码。显然,该标准的更高版本还允许在非声明语句之后声明局部变量。

于 2013-01-07T15:00:12.337 回答
0

在 C99 之前,局部变量声明必须在块的顶部声明。如果您的编译器不支持 C99,您可以简单地使用 C++ 编译,或者创建一个无条件语句块

int main()
{
    char buf[256];

    printf("\nString - Enter your string: ");
    scanf ("%s", buf);

    // Unconditional block to localise the variable buf
    {
        char *_S = buf;

        ...
    }

    // buf no longer in scope here
    ...
}
于 2013-01-07T15:11:31.907 回答