这种自我指派是否做了明智的事情?

Fab*_*ian 20 c c++

我刚刚在一个函数中找到了这行代码,这让我很困惑.这在任何情况下都有意义,还是未定义的行为?

char * acFilename = acFilename;
Run Code Online (Sandbox Code Playgroud)

编辑:编译器抱怨警告C4700,我正在使用未初始化的变量.

M.M*_*M.M 59

在块范围内,在C++中,这是未定义的行为,因为右侧在变量初始化之前读取变量(C++ 14 [dcl.init]/12).

在块范围内,在C11中,这可能是未定义的行为或表现为未初始化的变量,具体取决于实现的各种细节和函数的其余部分,请参见此处以进行详细分析.

在命名空间范围内,在C++中,可以很好地定义并生成空指针.这是因为在考虑初始化器之前,所有静态变量都是零初始化的.(C++ 14 [basic.start.init]/2).

在C中的文件范围内,它是一个约束违规; 静态变量必须具有常量表达式作为初始化程序,并且变量的值不能是常量表达式.


nvo*_*igt 24

没有这个代码没有任何意义.这可能是一个错字,也许有人打算使用

char* acFilename = ::acFilename;
Run Code Online (Sandbox Code Playgroud)

要么

char* acFilename = m_acFilename;
Run Code Online (Sandbox Code Playgroud)

或者是其他东西.

就目前而言,它充其量只是令人困惑和无益,可能是一个错误,因为有人想要使用不同的变量.

  • @TheodorosChatzigiannakis为新声明的本地变量分配一个全局变量. (6认同)

Art*_*Art 19

我以前见过这个.由于gcc对其未初始化的变量警告非常满意,因此这是使这些警告静音的技巧.不确定它是gcc的有意设计选择还是编译器只是愚蠢,但我看到人们故意这样做以使gcc闭嘴(并且在此过程中打破了将来可能正确的警告).

我只需将其初始化为NULL替换它.这是一个坏习惯,不适用于其他编译器,并且NULL不能比不确定的值和未定义的行为更正确.

只是为了演示这是如何工作的(也是因为我想知道更新的gcc版本是否仍然这样做):

$ cat foo.c
int
foobar(void)
{
    int foo;
    return foo + foo;
}
$ cc -c -Wall -O2 foo.c
foo.c: In function ‘foobar’:
foo.c:6:13: warning: ‘foo’ is used uninitialized in this function [-Wuninitialized]
  return foo + foo;
         ~~~~^~~~~
$ ed foo.c
[...]
$ cc -c -Wall -O2 foo.c
$ cat foo.c
int
foobar(void)
{
    int foo = foo;
    return foo + foo;
}
$ cc -c -Wall -O2 foo.c
$ cc -v
[...]
gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
$
Run Code Online (Sandbox Code Playgroud)

  • @MM我不想要它.这个例子展示了gcc的行为方式. (6认同)
  • 为什么你要在这个特定的例子中使警告静音?它告诉你一个严重的错误. (2认同)
  • @tomsmeding为什么不呢? (2认同)

归档时间:

查看次数:

4070 次

最近记录:

8 年,11 月 前