两个函数声明共享一个定义,这合法吗?
Two functions declarations share one definition, is this legal?
另一个新手问题:
int foo(); // outer foo function
int main() {
int foo(); // inner foo function
cout << foo() << endl;
}
int foo() { // one definition
return 42;
}
根据我的理解,函数或对象的内部声明将隐藏外部声明(如果有的话)。
所以上面的外部foo()和内部foo()应该是两个不同的函数。
但他们都有一个共同的定义,这似乎令人困惑。两个不同的函数共享一个定义合法吗?两个不同的对象变量呢?(这是c++的问题,但语法似乎也适合C)
编辑:
使用指向函数的指针来验证外部foo和内部foo是同一个函数:
pf_outer = 0x400792
pf_inner = 0x400792
内部的foo
只是同一个foo()
的另一个正向减速。考虑下面的例子:
int foo();
int foo();
int main() {
cout << foo() << endl;
}
int foo() { // one definition
return 42;
}
这将编译并运行,并且没有歧义,因为编译器将用相同的代码替换相同函数的使用。
可以重新声明函数
这样重新声明一个函数是非常好的,我们可以从c++标准草案的两个地方看到这一点,在3.1
声明和定义部分,其中说:
声明(第7条)可以在类中引入一个或多个名称翻译单元或重新声明前面介绍的名称声明。[…]
,接着说:
声明是定义,除非它声明了一个没有的函数指定函数体[…]
和13.1
可重载声明段落3说:
形参声明的不同之处仅在于使用了等效性类型定义的"类型"是等价的。typepedef不是一个单独的类型,而是只是另一个类型的同义词(7.1.3)。(例子:
typedef int Int; void f(int i); void f(Int i); // OK: redeclaration of f(int) void f(int i) { /* ... */ } void f(Int i) { /* ... */ } // error: redefinition of f(int)
-end example]
两个声明将引用同一个定义,不允许重新定义函数。
的函数声明也可以通过最外层的cv-限定符来区分。相关文章:
- 我希望定义两个具有相同代码的不同名称的库
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 为什么累积C++定义了两个模板
- 在两个.cpp文件之间定义全局类/结构指针
- 宏定义中的预处理器令牌两边有两个双引号
- 如何在两个不同的命名空间(但只写一次)中使用相同的标头定义,命名空间有不同的实现?
- 基于对象的两个属性的自定义比较器会引发异常
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 为什么我无法比较自定义类类型的两个向量?
- 宏的定义从一个值创建两个参数
- 错误:当定义两个带有标头文件的类时,将重新定义类
- 为什么 for 循环不能定义两个作用域的变量?
- 比较两个用户定义的类型向量
- 如何定义两个具有相同基类型的不同类型的C++构造函数
- 类定义 - 两个文件
- 在一个类中定义两个类,并访问其成员
- 为什么我不能一次定义两个指针
- 是否有可能在某个表达式中定义两个单词,而不仅仅是一个单词
- 在c++中定义两个具有相同签名的函数