即使foo内联定义但未声明为以下代码,并且bar内联声明但未定义为以下代码,下面的代码段也可以毫无问题地进行编译。
int foo();
inline int foo() { return 3; }
inline int bar();
int bar() { return 4; }
inline int foobar();
inline int foobar() { return 5; }
int main(){
// ...
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题:编译器是否读foo为内联?那bar呢 这是由C ++标准指定的吗?
我的第二个问题:声明和定义内联函数的最佳实践是哪一个?是foo吗 bar?还是foobar?为什么?
inb4我阅读了与此相关的其他文章,但没有一个直接回答我的问题。
这个答案似乎暗示这foo是内联的,但是什么也没说bar。它也没有解释为什么 foo比其他人更受欢迎。该答案讨论了何时应该使用内联函数。这不是我的担心:我已经决定使用内联函数。我的问题(确切地说是问题2)是我应该这样声明还是定义它,或者两者都定义,为什么其中一个约定比其他约定更好。这个问题似乎更接近我的关注,但没有人回答。
这就是我提出这个问题的原因:我写了很多bash和Perl脚本,我发现自己必须经常连接两个路径.像这样的东西是典型的:
my $prefix = "/home/user/";
my $suffix = "/mystuff";
...
chdir $prefix.$suffix;
Run Code Online (Sandbox Code Playgroud)
问题是我并不总是记得我是否在前缀的末尾添加了斜杠,或者我是否在后缀的开头添加了斜杠.所以我可能会意外地将两个斜杠连接在一起,就像上面的例子一样.
所以我的主要问题是两个连续斜线是否会导致任何问题以及原因.但是,程序员也有这样的约定吗?在其他人编写的代码中,目录名是否总是以斜杠结尾?如果有一些我可以遵循的一致规则会很好.
这是一个代码片段来演示我的问题.
namespace N{
enum E { A, B, C, D };
}
int main(){
using N::E;
E e = A; // syntax error: 'A' is not declared
}
Run Code Online (Sandbox Code Playgroud)
最后一行给出了语法错误.我想使用的名称N::A,N::B,N::C以及N::D在没有命名空间限定的主要功能N::.但我不希望做以下两件事情
(1)我不想说using namespace N,因为那将导入N中的其他所有内容.
(2)我不想说using N::A,using N::B等了枚举的每一个成员.因为那时如果我想修改枚举,我也必须改变我的主要功能.更不用说额外的打字是乏味且容易出错的.
我试着自己寻找答案,但不能.任何帮助表示赞赏.