C++ 内联函数选择条件
我有以下资料:C++ 内联函数选择条件,c++,inline,one-definition-rule,C++,Inline,One Definition Rule,我有以下资料: //a.cpp inline int f(int x) { return x; } int g(int x) { return f(x); } //b.cpp #include <iostream> inline int f(int x) { return x + 1; } extern int g(int); int main() { std::cout << g(2) << f(2) << std::endl; }
//a.cpp
inline int f(int x) { return x; }
int g(int x) { return f(x); }
//b.cpp
#include <iostream>
inline int f(int x) { return x + 1; }
extern int g(int);
int main() {
std::cout << g(2) << f(2) << std::endl;
}
//a.cpp
内联int f(int x){return x;}
int g(int x){返回f(x);}
//b、 cpp
#包括
内联int f(int x){返回x+1;}
外部INTG(int);
int main(){
std::可以您在这里破坏ODR(OneDDefinitionRule),并且程序不正确,无需诊断
每个内联定义应该是相同的。您在这里破坏了ODR(OneD定义Rule),并且程序格式不正确,无需诊断
每个内联定义应该相同。您的代码格式错误,不需要诊断。所有单元中的所有内联函数定义都必须相同
由于您没有这样做,代码的格式不正确,但允许编译,并且不需要引起任何类型的警告或错误。您的代码格式不正确,不需要诊断。所有翻译单元中的所有内联函数定义都必须相同
既然您没有这样做,代码的格式是错误的,但是它是允许编译的,并且不需要引起任何警告或错误。您的意思是您编译并链接了a.cpp和b.cpp吗?是的。没错!这似乎是相关的:您打开优化了吗?我怀疑您可能会对无优化/debu得到不同的答案g构建(无内联)与优化/发布构建(有内联)。你的意思是你编译并链接了a.cpp和b.cpp吗?是的。这似乎很重要:你开启了优化吗?我怀疑你可能会得到一个不同的答案:无优化/调试构建(无内联)与优化/发布构建(有内联)。也许扩展ODR的含义有助于完成此答案。也许扩展ODR的含义有助于完成此答案。也许可以链接到以获取更多详细信息,或者自己更详细地解释ODR?“对于内联函数[…],在使用ODR的每个翻译单元中都需要定义。”没有提到不同的定义。我能说我介绍的是一种未指定的行为吗?@joãopauli no,它是UB。请参阅此处的列表项1:@jo-no..噢,很好!明白了!可能链接到以获取更多详细信息,或者自己更详细地解释ODR?”对于内联函数[…],在使用odr的每个翻译单元中都需要一个定义。“没有提到不同的定义。我能说我所介绍的是一种未指明的行为吗?@joãopauli不,它是UB。请看这里的列表项1:@jo-不..哦,很好!明白了!