我可以将extern和const混合为extern const吗?如果是,const限定符是否仅在其声明的范围内强加它的统治,或者它是否应与它声明的转换单元的声明完全匹配?即extern const int i;即使实际的i不是const,反之亦然,我可以声明说吗?
我正在研究的程序有很多适用于所有类的常量.我想制作一个头文件"Constants.h",并能够声明所有相关的常量.然后在我的其他课程中,我可以包括#include "Constants.h.
我使用#ifndef... #define ...语法使其工作正常.但是,我更喜欢使用const int...常量的形式.我不太清楚如何.
我有两个问题:
1)为什么在C++中允许指向内联函数的指针?我已经读过内联函数的代码只是被复制到函数调用语句中,内联函数中没有编译时内存分配.那么为什么内联函数存在一个指针,因为内联函数没有固定的内存地址?
2)考虑以下代码:
inline void func()
{
int n=0;
cout<<(&n);
}
Run Code Online (Sandbox Code Playgroud)
它是否应该打印不同值的n每次func()调用地址?[因为我认为每次复制内联函数代码时,必须重新分配局部变量(而在正常函数的情况下,重新初始化会发生)]
我是初学者,为了加强我的概念,我问了这个问题.如果我在任何地方都错了,请纠正我.
是否可以声明一个变量extern constexpr并在另一个文件中定义它?
我试了但是编译器给出了错误:
constexpr变量'i'的声明不是定义
在.h:
extern constexpr int i;
Run Code Online (Sandbox Code Playgroud)
在.cpp中:
constexpr int i = 10;
Run Code Online (Sandbox Code Playgroud) 我刚刚发现以下内容无效.
//Header File
class test
{
const static char array[] = { '1', '2', '3' };
};
Run Code Online (Sandbox Code Playgroud)
初始化这个的最佳位置在哪里?
我想要做的只是在头文件中定义一个变量,并在两个不同的cpp文件上使用它,而不是每次我包含该头时重新定义该变量
这是我尝试的方式:
Variables.h
#ifndef VARIABLES_H // header guards
#define VARIABLES_H
static bool bShouldRegister;
#endif
Run Code Online (Sandbox Code Playgroud)
(我也试过extern但没有改变)
在cpp文件中,我给它一个值::bShouldRegister = true或bShouldRegister = true;
在我的另一个cpp文件中,我通过创建一个线程并在循环中检查它的值来检查它的值(是的,我的线程函数运行良好)
while (true)
{
if (::bShouldRegister) // Or if (bShouldRegister)
{
MessageBox(NULL,"Value Changed","Done",MB_OK|MB_ICONINFORMATION);
}
Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
是的,MessageBox永远不会出现(bShouldRegister永远不会成真:/)
这是我的汇编级代码......
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg
Run Code Online (Sandbox Code Playgroud)
输出:
root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out
KingKong
Run Code Online (Sandbox Code Playgroud)
我的问题是全球_start用于什么?我和Mr.Google试了一下运气,我发现它用来说明程序的起点.为什么我们不能_start告诉程序在哪里开始,如下面给出的那个在屏幕上产生一种警告
section .text
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data …Run Code Online (Sandbox Code Playgroud) 为什么cppreference定义type_traits xxx_v快捷方式inline constexpr而不仅仅是constexpr?
例如,请参阅is_integral_v:
template< class T >
inline constexpr bool is_integral_v = is_integral<T>::value;
Run Code Online (Sandbox Code Playgroud)
这只是风格问题还是行为有所不同?据我所知,constexpr变量是隐含的inline.
编辑:查看最新标准的草案,它也使用inline constexpr.那么问题实际上适用于标准.
据我所知,一个非常常见的情况是这样的
template<int i> class Class
{
public:
static constexpr int I = i;
static constexpr int J = constexprFunction(i);
// further Class implementation
};
Run Code Online (Sandbox Code Playgroud)
几乎同样普遍的我看到错误(事实上我的大部分问题是因为我忘记了,并且不知道,正确的问题是什么)如果成员使用的话会忘记附加的定义:
template<int i> constexpr int Class<i>::I;
template<int i> constexpr int Class<i>::J;
Run Code Online (Sandbox Code Playgroud)
现在我读了cppreference:Definitions和ODR以及cppreference:静态成员,声明这是C++ 17不推荐使用的.这对我来说似乎很棒,因为它避免了很多错误.但是还有其他问题出现了:
1)这改变了其他原因,而不是使附加定义无用吗?(另见本问题的最后一段)
2)在cppreference的最后一个例子中:静态成员似乎也适用于const static成员 - 但规则只声明了constexpr成员.是否适用于const static会员?
3)所有的例子,我发现用一个简单的定义一样Class::I-做这一切还保持了形势Class:J与constexpr功能?
简要说明在C++ 17和C++ 17之前最佳实践是什么.总而言之,这对我来说似乎是一个非常棘手的变化,因为它会产生很多代码,这些代码之前需要"格式化不需要诊断"才能获得良好的代码(据我所知......).因此,会产生代码,对于较早的(前17版)编译器仍然是"不需要的非诊断" - 但只要不需要使用odr,这些就不会抱怨.
编辑:更正了Aaron McDaid建议的文字.
inlineC++中的关键字允许在头文件中定义函数,以便编译器可以实际内联它们或只保留函数的一个副本.这允许通过直接在头文件中定义函数来减少编译单元的数量,其优点通常是编译时间快几倍,并且执行速度可能更快.
为什么这个相同的模式不能应用于命名空间范围变量,而C++中的函数在将它们视为特殊指针时实际上是命名空间范围变量?
我能想到的是使用内联函数的静态局部变量.
inline std::string& Hello__() { //Edit: Added the &
static std::string hello("Hello");
return hello;
}
#define Hello (Hello__())
Run Code Online (Sandbox Code Playgroud)
编辑:我想澄清我的问题如下.
我正在使用术语'inline'作为编译器理解的内容.它允许具有相同名称的相同定义在多个编译单元中,允许标题中的定义."内联"的主要优点不是宏功能所具有的性能优势,而是编译单元数量减少所需的编译时间更短.它可能会短几倍.
我确实提出了一个解决方案,让变量像内联函数一样工作.但我仍然在寻找更好的方法来做到这一点.
为了清楚地说明,我想要实现的是在标题中定义名称空间范围变量,就像内联函数一样,以便使构建过程尽可能简单快速.
EDIT2:谢谢你的链接通过DYP评论.我刚读过这个提案,这正是我的想法.该提案的现状如何?
引自该提案:
然而,希望存在全局唯一对象而不必选择用于定义它的单个翻译单元并不罕见.实际上,做出这种选择通常需要使用非平凡的预处理器宏,单独编译的库或两者.但是,C++的一个优势是它支持headeronly库开发的能力.在这种情况下,缺乏定义内联变量的能力对库设计造成了重大限制.