【发布时间】:2012-04-04 08:59:29
【问题描述】:
谁能指出我在 C++ 标准中的一个参考,它保证我在函数 foo1() 中的自动 char* q将始终在 foo1() 中调用 p = bar() 后初始化。我非常习惯于在 foo2() 中创建一个新块,并且想知道我是否对优化编译器过于块状和偏执。或者我的偏执是正确的,不应该假设编译器不会优化代码,使得 p = bar() 总是在 q(p) 之前被调用? 谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
char* bar()
{
char* t = (char*)malloc(15);
strcpy(t, "Hello World!");
return t;
}
void foo1(void)
{
char* p = NULL;
printf("foo1: do some stuff\n");
p = bar();
printf("foo1: do some more stuff\n");
char* q(p);
printf("foo1: q says:%s\n", q);
free(p);
}
void foo2(void)
{
char* p = NULL;
printf("foo2: do some stuff\n");
p = bar();
printf("foo2: do some more stuff\n");
// is this block necessary?
{
char* q(p);
printf("foo2: q says:%s\n", q);
}
free(p);
}
int main(int ac, char* av[])
{
foo1();
foo2();
return 0;
}
【问题讨论】:
-
哇——你能说“冒充 C++ 的可怕 C 代码”吗?
-
目前我无法指出标准的特定部分,但要查找的关键短语是 sequence point。
-
@Steve 我更喜欢将
char* q = p;写成char* q(p);,这样就不会与q混淆了,这是一个接受p类型参数并返回char*的函数. -
@Steve:为了人类,请使用
std::string。没有理由像现在这样一直在 C++ 中通过malloc()/free()手动管理内存。 tinyurl.com/dont-use-pointers -
@DeadMG、Mahesh 和 tiny:对于使用“C”代码作为 C++ 来呈现问题,我深表歉意。有些'C'编译器会编译这个,有些不会。到目前为止,我尝试过的所有 C++ 编译器都会。我想不出一种更简单的方法来用更少的 LOC 来传达问题。感谢您的主题回复。
标签: c++ initialization scope