仅为 ISO C99 模式设置代码块
Set CodeBlocks for ISO C99 mode only
如何设置我的编译器只允许编译在 ISO C99 模式下编写的代码?
我做了以下事情:
项目 -> 属性 -> 项目的构建选项 -> 这里我选择了 ISO C99
然而,当我尝试编译时:
#include <stdio.h>
int main()
{
for(int i=0;i<5;i++)
printf("%d",i);
return 0;
}
我没有收到任何警告,
我应该得到警告:
for loop declarations are not allowed in C99 mode.
你能帮我解决这个问题吗?
现在我收到警告
'for' loop initial declarations are only allowed in C99 or C11 mode
问题是这在C90模式下是不允许的,而在C99模式下是允许的。
C99 确实支持在 for-loop 的迭代语句中声明变量。参考C99标准的6.8.5:
iteration-statement:
while ( expression ) statement
do statement while ( expression ) ;
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expression opt ; expressionopt ) statement
6.8.5.3 进一步阐明了在for-loop 迭代子句中声明的变量的作用域:
The statement
for ( clause-1 ; expression-2 ; expression-3 ) statement
behaves as follows: The expression expression-2 is the controlling expression that is
evaluated before each execution of the loop body. The expression expression-3 is
evaluated as a void expression after each execution of the loop body. If clause-1 is a
declaration, the scope of any variables it declares is the remainder of the declaration and
the entire loop, including the other two expressions; it is reached in the order of execution
before the first evaluation of the controlling expression. If clause-1 is an expression, it is
evaluated as a void expression before the first evaluation of the controlling expression.
GNU GCC 使用以下检查语法是否符合 C99 标准
-std=c99 -pedantic
发出严格的 ISO C99 标准要求的所有警告。
然而,https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Warning-Options.html提到:
一些用户尝试使用 -pedantic
来检查程序是否严格符合 ISO C。他们很快发现它并没有完全按照他们的意愿行事:它找到了一些 non-ISO 实践,但不是全部 — 只有 ISO C 需要诊断的那些,以及已添加诊断的其他一些实践。
报告任何不符合 ISO C 的情况的功能在某些情况下可能有用,但需要大量的额外工作
并且与 -pedantic
完全不同。我们近期没有支持此类功能的计划。
假设您的程序名为 main.c
(使用您给出的示例代码),您可以从 shell 终端
使用以下命令
gcc -o main -std=c99 -pedantic main.c
如何设置我的编译器只允许编译在 ISO C99 模式下编写的代码?
我做了以下事情:
项目 -> 属性 -> 项目的构建选项 -> 这里我选择了 ISO C99
然而,当我尝试编译时:
#include <stdio.h>
int main()
{
for(int i=0;i<5;i++)
printf("%d",i);
return 0;
}
我没有收到任何警告, 我应该得到警告:
for loop declarations are not allowed in C99 mode.
你能帮我解决这个问题吗?
现在我收到警告
'for' loop initial declarations are only allowed in C99 or C11 mode
问题是这在C90模式下是不允许的,而在C99模式下是允许的。
C99 确实支持在 for-loop 的迭代语句中声明变量。参考C99标准的6.8.5:
iteration-statement:
while ( expression ) statement
do statement while ( expression ) ;
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expression opt ; expressionopt ) statement
6.8.5.3 进一步阐明了在for-loop 迭代子句中声明的变量的作用域:
The statement
for ( clause-1 ; expression-2 ; expression-3 ) statement
behaves as follows: The expression expression-2 is the controlling expression that is evaluated before each execution of the loop body. The expression expression-3 is evaluated as a void expression after each execution of the loop body. If clause-1 is a declaration, the scope of any variables it declares is the remainder of the declaration and the entire loop, including the other two expressions; it is reached in the order of execution before the first evaluation of the controlling expression. If clause-1 is an expression, it is evaluated as a void expression before the first evaluation of the controlling expression.
GNU GCC 使用以下检查语法是否符合 C99 标准
-std=c99 -pedantic
发出严格的 ISO C99 标准要求的所有警告。
然而,https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Warning-Options.html提到:
一些用户尝试使用 -pedantic
来检查程序是否严格符合 ISO C。他们很快发现它并没有完全按照他们的意愿行事:它找到了一些 non-ISO 实践,但不是全部 — 只有 ISO C 需要诊断的那些,以及已添加诊断的其他一些实践。
报告任何不符合 ISO C 的情况的功能在某些情况下可能有用,但需要大量的额外工作
并且与 -pedantic
完全不同。我们近期没有支持此类功能的计划。
假设您的程序名为 main.c
(使用您给出的示例代码),您可以从 shell 终端
gcc -o main -std=c99 -pedantic main.c