【问题标题】:Why won't "gcc-std=c99 ...." allow me to use VLAs? [closed]为什么“gcc-std=c99 ....”不允许我使用 VLA? [关闭]
【发布时间】:2016-01-02 01:29:53
【问题描述】:

我正在尝试使用

编译下面的代码

gcc -c -g -std=c99 -MMD -MP -MF "build/Debug/Cygwin_4.x-Windows/main.o.d" -o build/Debug/Cygwin_4.x-Windows/main.o main. cpp

下面的代码在函数 func 中使用了 VLA,我认为 c99 应该支持它,我相信我通过标志 -std=c99 使用它。

问题是当我运行它时,我收到以下警告和错误:

cc1plus:警告:命令行选项“-std=c99”对 C/ObjC 有效,但对 C++ 无效

main.cpp:11:35: 错误:在 ']' 标记之前使用函数体外部的参数 无效函数(int a,int b,int arry[a][b]){ ^

main.cpp:11:38: 错误:在 ']' 标记之前使用函数体外部的参数 void func(int a, int b, int arry[a][b]){

第一个警告让我怀疑 gcc 是否试图将代码编译为 c 或 c++。第二个让我觉得使用 VLA 功能有问题,虽然我的理解是 c99 应该支持。

代码是:

void func(int a, int b, int arry[a][b]){
 //Do stuff
}


int main(int argc, char** argv) {

    int setSize=6;
    int sets[setSize][setSize]={0};

    func(setSize,setSize,sets);

    return 0;
}

【问题讨论】:

  • 如果文件不是 C++,你为什么将它命名为 main.cpp?还是这样?
  • 您从帖子中删除的评论与此非常相关——这是我的 IDE 中的默认设置。
  • @ABD:因为“...但不适用于 C++”很清楚,警告是由程序 cc1plus 产生的,此外 C++ 没有根本不允许 VLA。
  • @ABD:gcc 的行为会根据您传递给它的内容而有所不同。默认情况下,如果您将 .cpp 文件传递​​给它,它会将其编译为 C++,无论您是以 gcc 还是 g++ 调用它。
  • gcc 是 Gnu 编译器 Collection 并且可以充当不仅仅是 C 的前端。如果您的文件没有正确的扩展名,请传递 @987654328 @强制C模式

标签: c arrays gcc


【解决方案1】:

gcc 是 Gnu 编译器 Collection 并且可以作为 C 的前端(尽管不使用特定于语言的 shim 可能会在不传递其他选项的情况下失败,如果它可以工作的话) .

如果您的文件没有正确的扩展名,您可以通过-x 明确设置语言,例如-xc 在您的情况下。

但是,最好的选择是修复文件名。

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 2012-08-15
    • 2012-11-17
    • 2010-10-09
    • 2020-12-27
    • 2018-08-21
    • 2016-08-31
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多