C ++中的inline
关键字允许在头文件中定义函数,以便编译器可以实际内联它们或只保留函数的一个副本。这允许通过直接在头文件中定义函数来减少编译单元的数量,其优点通常是编译时间快几倍,并且执行速度可能更快。
为什么这个相同的模式不能应用于命名空间范围变量,而C ++中的函数在将它们视为特殊指针时实际上是命名空间范围变量?
我能想到的是使用内联函数的静态局部变量。
inline std::string& Hello__() { //Edit: Added the &
static std::string hello("Hello");
return hello;
}
#define Hello (Hello__())
编辑:我想澄清我的问题如下。
我正在使用术语'inline'作为编译器理解的内容。它允许具有相同名称的相同定义在多个编译单元中,允许标题中的定义。 “内联”的主要优点不是宏功能所具有的性能优势,而是编译单元数量减少所需的编译时间更短。它可能会短几倍。
我确实提出了一个让变量像内联函数一样工作的解决方案。但我仍然在寻找一种更好的方法来做到这一点。
要再次清楚地说明,我想要实现的是在标题中定义名称空间范围变量,就像内联函数一样,以便使构建过程尽可能简单快速。
编辑2:感谢您在dyp的评论中提到link。我刚读过这个提案,这正是我的想法。该提案的当前状态是什么?
引自提案:
然而,希望存在a的情况并不少见 全局唯一对象,无需选择单个翻译 用于定义它的单位。作为一个实际问题,做出这个选择 通常需要使用非平凡的预处理器宏, 单独编译的库或两者。但是,C ++的一个优势 是它支持标题库开发的能力。在 这种情况,缺乏定义内联变量的能力 对图书馆设计的重大限制。
答案 0 :(得分:16)
C ++ 17有gulp.task('clientDeploy', function () {
return gulp.src('client/dist/**/*')
.pipe(chown('rf', 'rfids'))
.pipe(gulp.dest('/var/www/html/dashboard'));
});
,请参阅:N4424。
答案 1 :(得分:2)
以下是我对您的建议进行的简短实验:
档案a.cpp:
inline int& get_inline_int() {
static int my_inline_int = 0;
return my_inline_int;
}
void set_me(int x) {
get_inline_int() = x;
}
文件b.cpp:
#include <iostream>
inline int& get_inline_int() {
static int my_inline_int = 0;
return my_inline_int += 2;
}
void show_me() {
std::cout << get_inline_int() << std::endl;
}
文件main.cpp:
void set_me(int);
void show_me();
int main() {
set_me(7);
show_me();
set_me(8);
show_me();
return 0;
}
我作弊了一下,给了同一个函数两个不同的实现。如果没有内联,链接器会抱怨重复的符号,但是我使用内联使用它就可以了。
我不得不承认结果让我感到惊讶。我用g ++和clang ++尝试了它并获得了类似的结果:
clang++ a.cpp b.cpp main.cpp -o runme
将输出
7
8
clang++ b.cpp a.cpp main.cpp -o runme
将输出
9
10
所以,我认为这是对语言的误用,因为编译结果是不可预测的,通常不是你的意思。如果一个委员会能够定义一个可预测的行为,我会使用这些所谓的&#34;内联&#34;变量我自己。
答案 2 :(得分:0)
变量实际上可以是inline
d,但它们在全局范围内不会相同。
zzz.h:
#ifndef ZZZ_H_b6e267bb76401a0cd6502e426a702e41d792a853
#define ZZZ_H_b6e267bb76401a0cd6502e426a702e41d792a853
namespace {
int omg;
}
static int hello;
// int thisWouldBreakCompilationSoIsCommentedOut;
#endif
xxx.cpp:
#include "zzz.h"
zzz.cpp:
#include "zzz.h"
int main() {}
让我们看看它是否完全编译:
$ g++ xxx.cpp zzz.cpp
$
答案 3 :(得分:-1)
您的&#34;内联变量&#34; Hello
的行为与全局变量完全相同。唯一的区别是,除了在标头中声明之外,全局变量还需要在单个编译单元中定义,而Hello
不需要。{/ p>
我想,为什么没有语言支持&#34;内联变量&#34;简直就是全局变量无论如何都被认为是邪恶的。你只是不在现代代码中使用它们。因此,语言不应该增加语法的复杂性,以支持不使用的东西。