c+中的名称空间+;和c 我并不是在我的专业工作中写下如下代码,下面的代码是合法的,在C++和C:中没有警告就编译了 #include <stdlib.h> typedef struct foo { int foo; } foo; foo * alloc_foo () { return (struct foo*) malloc(sizeof(foo)); } struct foo * alloc_struct_foo () { return (foo*) malloc(sizeof(struct foo)); } foo * make_foo1 (int val) { foo * foo = alloc_struct_foo (); foo->foo = 0; return foo; } struct foo * make_foo2 (int val) { struct foo * foo = alloc_foo(); foo->foo = 0; return foo; } >,两个问题,一个与C和C++有关,另一个与C++,有关。

c+中的名称空间+;和c 我并不是在我的专业工作中写下如下代码,下面的代码是合法的,在C++和C:中没有警告就编译了 #include <stdlib.h> typedef struct foo { int foo; } foo; foo * alloc_foo () { return (struct foo*) malloc(sizeof(foo)); } struct foo * alloc_struct_foo () { return (foo*) malloc(sizeof(struct foo)); } foo * make_foo1 (int val) { foo * foo = alloc_struct_foo (); foo->foo = 0; return foo; } struct foo * make_foo2 (int val) { struct foo * foo = alloc_foo(); foo->foo = 0; return foo; } >,两个问题,一个与C和C++有关,另一个与C++,有关。,c++,c,syntax,C++,C,Syntax,C/C++问题:为什么我不能定义函数foo? 似乎我应该能够定义函数foo;函数名和变量名是“普通标识符”。但如果我添加最后一点代码,我会得到错误:将“foo”重新定义为不同类型的符号 问题:foo*foo是完全合法的,那么为什么intfoo(foo*)法律 < P> C++问题:C++中的这一切是如何工作的? “名字空间”的含义在C++中的含义比C语言中的含义不同。在C++标准中,没有找到任何关于名称空间C概念的东西,这就是上面提到的C.BR>中的法律。 问题:C++中的这一法律是什么(章和

C/C++问题:为什么我不能定义函数
foo

似乎我应该能够定义函数
foo
;函数名和变量名是“普通标识符”。但如果我添加最后一点代码,我会得到
错误:将“foo”重新定义为不同类型的符号

问题:
foo*foo是完全合法的,那么为什么
intfoo(foo*)法律

< P> C++问题:C++中的这一切是如何工作的? “名字空间”的含义在C++中的含义比C语言中的含义不同。在C++标准中,没有找到任何关于名称空间C概念的东西,这就是上面提到的C.BR>中的法律。 问题:C++中的这一法律是什么(章和诗优先)?< /P>

这在C++中也不起作用。问题是gcc/g++的预处理器正在寻找

\uuucplusplus
,而不是
cplusplus
。因此,您需要预处理器语句

#if defined FOO && ! defined cplusplus
#undef FOO
#endif

无法正常工作。

因为已经存在函数
foo()
它是
struct foo的默认构造函数

typedef struct foo 
{ 
int a; 
foo(int val)
:a(val) 
{}
} foo;


int foo(int value)
{
  cout << value <<endl;
}

void main()
{
   foo foovar = foo(50); // constructor foo or function foo?
}
typedef结构foo
{ 
INTA;
foo(int-val)
:a(val)
{}
}傅;
int foo(int值)
{
库特
foo*foo;
是完全合法的,那么为什么int
foo(foo*);
不合法呢

因为在与函数相同的声明上下文中已经有一个名为
foo
的类型。在同一范围中不能有相同名称的类型和函数

<>这在C++中如何工作?

因为您可以在嵌套作用域中隐藏名称。当您声明
foo*foo
时,第一个
foo
引用该类型。第二个
foo
声明一个变量——此时,类型
foo
被隐藏。在
foo*foo
之后尝试声明
foo*baz
,它应该会失败

struct foo {};

void test() {
   foo * foo; // first `foo` is the type, second `foo` is the variable
   foo * baz; // first `foo` is the variable
}

在C++11中,3.3.1/4表示在声明性区域中,名称的所有声明都必须引用同一个实体(或重载集)。有一个例外,允许您将类名用于一组函数名(因此
foo()
隐藏
class foo
),但如果您有一个typedef(您这样做的话),这不适用


用C++中的 TyPulfFraseFuo<<代码>尝试它,省略了“为什么我可以在C++中定义函数FO?”“你能吗?”VladLazarenko:“是的,我可以。试试这两个代码:Wall,C-DFO,FO。CC < /COD>和<代码> CLAN-WORK-C-DFO Fo.CC < /C>未经警告编译。这是否只是这两个编译器的侥幸,我不知道。因此C++定义问题>你定义了代码> CPLUS PLUS < /COD>?“为什么我不能定义函数FO?”我猜想名为foo的变量和名为foo的函数会引起问题,因为您可以将函数名用作函数指针。@jswolf19:投诉是关于typedef name

foo
和函数
foo
之间的冲突。请注意,我将
foo
用作变量名的地方只有loca函数中的变量。你是对的;我应该使用
\uuucplusplus
。我修改了这个问题。绝对不是。首先,构造函数没有名称,也无法通过名称查找找到。怎么回事?构造函数重载呢?foo();foo(int);foo(double);?你真的理解重载是如何工作的吗?
foo(50)
从技术上讲不是调用构造函数。它是“函数表示法中的显式类型转换,
foo
是类型的名称,而不是构造函数的名称。@Alan Sokes哦,是吗?关于
复杂(5,5);
?这也是类型转换?@GreenScape:短语“构造函数没有名称”有两种含义:一种是程序员的,另一种是编译器的。这对程序员来说意味着不能在代码中直接调用构造函数。这对编译器供应商来说意味着,无论他们给某个构造函数起什么内部名称,这些内部名称都不能与内部名称冲突给出了一些有效的C++名称。因为你可以在嵌套的范围内隐藏名字。这解释了为什么在C++中工作。和<代码> Fo*Fo.Fo*BAZ;< /C> >失败。(并且它也在C中失败)。+省略TyPulf确实让我定义了这个函数,再次感谢允许在C++中嵌套的范围内隐藏名字。
typedef struct foo
    { 
    int a; 
    foo(int val, double val2)
    :a(val) 
    {
      cout << val2 << endl;
    }
    } foo;


    int foo(int value, double val2)
    {
      cout << value << val2 << endl;
    }

    void main()
    {
       some_random_func(foo(50, 1.0)); // constructor foo or function foo?
    }
struct foo {};

void test() {
   foo * foo; // first `foo` is the type, second `foo` is the variable
   foo * baz; // first `foo` is the variable
}