在c++中使用内联函数输出未指定的输出



我正在玩代码来理解c++中的内部和外部链接。我想出了代码,其输出似乎根据链接的顺序而变化。


test1.cpp

#include<iostream>
using namespace std;
inline int c()
{
     static int p=0;
     p++;
     return p;
}
void a()
{
     cout<<"nIn function a() , c = "<<c();
}


test2.cpp

#include<iostream>
using namespace std;
inline int c()
{
    static int p=12;
    p++;
    return p;
}
void b()
{
       cout<<"nIn function b() , c = "<<c();
} 


driver.cpp

#include<iostream>
using namespace std;
void a();
void b();
int c();
int main()
{
   b();
   a();
   a();
   b();
   cout<<"nIn function main() = , c "<< c();
   cout<<"n";
}

输出1:

when compiles as follows :- 
bash#>g++ -c test1.cpp
bash#>g++ -c test2.cpp
bash#>g++ -c driver.cpp
bash#>g++ -o out driver.o test1.o test2.o
bash#>./out
In function b() , c = 1
In function a() ,  c = 2
In function a() ,  c = 3
In function b() , c = 4
IN main() , c = 5

在上面的输出中,编译器考虑在test1.cpp

中定义的c()

输出2:- 修改test1的顺序。0和test2。

bash#>g++ -o out driver.o test2.o test1.o
In function b() , c = 13
In function a() ,  c = 14
In function a() ,  c = 15 
In function b() , c = 16
IN main() , c = 17

在上面的输出中,编译器考虑在test2.cpp

中定义的c()

当我在代码中做了如下的小改动时,我感到很困惑:-如果我不调用函数a() [test1.cpp]中的c()和函数b()[test2.cpp]中的c()

//test1.cpp changes
void a()
{
   cout<<"nIn function a() , c = "; // not calling c()
}
//test2.cpp changes
void b()
{
    cout<<"nIn function b() , c = "; // not calling c()
} 

链接时出现以下错误:-

bash#>g++ -o out driver.o test1.o test2.o
driver.o: In function `main':
driver.cpp:(.text+0x1f): undefined reference to `c()'
collect2: ld returned 1 exit status

2)如果我在任何一个文件中调用c(),即在test1.cpp或test2.cpp中,那么我不会得到链接器错误。

有谁能帮我理解一下这种行为吗?

你的程序有未定义的行为,因为它违反了一个定义规则。两个不同的翻译单元定义了具有相同名称和签名的函数,但具有不同的主体。

c++ 11标准第3.2/6段:

[…)给这样一个名为D 的实体定义在多个翻译单元中,则

- D的每个定义应由相同的令牌序列组成;和

[…]

你的程序也是病态的,因为函数c()test1.cpptest2.cpp中被声明为inline,但在driver.cpp中没有。第7.1.2/4段

[…如果有外部链接的函数是在一个翻译单元中声明inline的,在所有出现该翻译单元的翻译单元中声明inline;不需要诊断。[…]

"no diagnostic is required"位表示编译器(或链接器)可能会也可能不会报告违反此规则的错误。这意味着你必须非常小心地打破它

相关内容

  • 没有找到相关文章

最新更新