我想知道是否有任何文件可以设置-std=c99标志,所以我不必为每次编译设置它.我在Ubuntu上使用GCC 4.4.
以下代码在gcc 4.8和Clang 3.2下编译:
int main()
{
int size = 10;
int arr[size];
}
Run Code Online (Sandbox Code Playgroud)
C++标准的8.3.4/1表示数组的大小必须是一个整数常量表达式,这size似乎不是.这是两个编译器中的错误,还是我错过了什么?
最新的VC++ CTP用这个有趣的消息拒绝代码:
error C2466: cannot allocate an array of constant size 0
Run Code Online (Sandbox Code Playgroud)
有趣的是,它似乎认为size是零.但至少它拒绝了代码.gcc和Clang应该不一样吗?
c++ arrays compile-time-constant variable-length-array c++11
关于C中如何禁止无效指针算术,至少有三篇不同的帖子; gcc 4.8.2允许它,假设void是字节大小; 以及如何打开额外的迂腐警告以触发错误.这是一个例子:
#include <stdio.h>
/* compile gcc -Wall -o try try.c */
int main() {
char *str="string";
void *vp= (void *) str;
++vp; /* arithmetic on void point. huh? */
printf("%s\n", (char*)vp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是考虑在无效代码的情况下C编译器应该做什么.当编译器不对无效代码发出编译错误时,它不被视为错误吗?
无论如何,这对于编译器来说似乎是奇怪的行为 - 即使gcc没有发出编译错误,至少它可以使用默认编译器标志发出"已弃用"警告.而且,即便如此
-Wall,它仍然没有发出警告.咦?这让我感到惊讶,因为gcc看起来非常成熟,而C并不是一种新颖或复杂的语言.