相关疑难解决方法(0)

具有数组分配的编译器的不同行为

与MSVC++ 2008相比,我最近发现了一个有趣的g ++行为.考虑这个小程序:

#include <cstdlib>

const int ARR_LENGTH = 512;

void doSomething( int iLen );

int main( int argc, char** argv )
{
    doSomething( ARR_LENGTH );
    return 0;
}

void doSomething( int iLen )
{
    int iTest[iLen];
    return;
}
Run Code Online (Sandbox Code Playgroud)

它会编译吗?你怎么看?根据我对C(或C++)的了解,这不应该编译,因为我可以用我想要的任何整数调用函数doSomething(),因此在编译时无法确定iTest数组的大小.但是,当我尝试用g ++编译它时,它工作得很好.现在我可以理解这里可能发生了什么 - 编译器注意到我只将一个编译时常量作为参数调用此函数.这里有一些严肃的优化......但是当我尝试使用MSVC++ 2008编译它时,我得到了这个:

1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size
Run Code Online (Sandbox Code Playgroud)

我的问题是:这如何符合语言的定义(C标准(C++标准))?g ++是否可以进行这样的优化(在这种情况下很容易看到,但是第一次遇到它时,它出现在一个大型项目中,乍一看并没有多大意义).

c++ compiler-construction optimization compile-time-constant

6
推荐指数
1
解决办法
172
查看次数

这个奇怪的函数定义意味着什么?

我在博客文章中遇到了这个C程序:

main()
{
    int n;
    n = 151;
    f(n);
}

f(x)
int x;
{
    printf("%d.\n", x);
}
Run Code Online (Sandbox Code Playgroud)

这篇文章没有解释.任何人都可以解释这个奇怪的函数定义意味着什么吗?

c function

5
推荐指数
2
解决办法
201
查看次数

哪个更好c89或c99

gcc 4.4.1

我只是想知道哪种标准更好,更便携?

我正在研究这个问题.并且发现c89仍然比c99广泛使用.没有多少C开发人员转向更新的c99标准.

而且,c89比c99更便携吗?

因为c99已经存在了我超过10年.我原本以为它会比c89标准使用更多并且同样便携?

非常感谢任何建议,

c

4
推荐指数
1
解决办法
1104
查看次数