我想了解外部联系和内部联系及其区别.
我也想知道的意思
const默认情况下,变量内部链接,除非另有声明extern.
const static int foo = 42;
Run Code Online (Sandbox Code Playgroud)
我在StackOverflow上的一些代码中看到了这个,我无法弄清楚它是做什么的.然后我在其他论坛上看到了一些困惑的答案.我最好的猜测是它在C中用来隐藏foo其他模块的常量.它是否正确?如果是这样,为什么有人会在C++上下文中使用它,你可以做到这一点private?
在2016年奥卢ISO C++标准会议上,一项名为Inline Variables的提案被标准委员会投票选为C++ 17.
通俗地说,什么是内联变量,它们如何工作以及它们对什么有用?如何声明,定义和使用内联变量?
见主题.他们在想什么?
更新:从"静态"更改为"内部链接"以避免混淆.
举个例子......把以下内容放在一个文件中:
const int var_a = 1;
int var_b = 1;
Run Code Online (Sandbox Code Playgroud)
......并g++ -c test.cpp仅用出口进行编译var_b.
在C和C++中,创建局部const变量的优势是static什么?假设初始化不使用其他变量,保持调用之间的值与每次调用设置相同的常量值之间是否有任何区别?
一个有效的C编译器可以忽略static吗?
在C++中,它避免了调用之间的构造/破坏,但是还有其他好处吗?
我正在使用 MS Visual Studio 2017, V. 15.9.8。
我正在使用优秀的 JetBrains ReSharper Ultimate 2019.1.2 Build 191.0.20190603.142841。它在指定的位置给我一个警告:
#include <vector>
struct T
{
std::vector<char> m;
const char *f() const
{
static const char emptyData; // ReSharper complains here
return m.size() ? &m[0] : &emptyData;
}
};
Run Code Online (Sandbox Code Playgroud)
消息是
file.h:应该初始化类型为“const unsigned char”的静态局部变量。这是非标准的 Microsoft C++ 扩展。
如果emptyData不是 const ,警告就会消失。
警告是错误的,因为所有静态数据,包括常量静态局部变量,都是按照标准的零初始化,对吧?
我对为什么在我的 extern.cpp 文件的定义中需要extern或不需要intvs感到困惑char*。我有以下测试程序:
// extern.cpp
extern const int my_int = 1;
const char* my_str = "FOO";
Run Code Online (Sandbox Code Playgroud)
// main.cpp
#include <iostream>
extern const int my_int;
extern const char* my_str;
int main() {
std::cout << my_int;
std::cout << my_str;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我删除externfromextern const int my_int = 1;那么我得到undefined reference to 'my_int'. 如果我将 extern 添加到const char* my_str = "FOO";然后我会收到警告'my_str' initialized and declared 'extern'。我为什么需要extern上my_int,但将它添加到 …
我对我教科书中的一个例子感到有点困惑.创建字符串时,会将其创建为类型字符串.但是,当相同的字符串传递给函数时,函数参数是const字符串而不是字符串.
这是代码的一部分:
int main()
{
string str;
cout << "blah blah..";
getline(cin, str);
if (is_pal(str))
.
.
.
}
bool is_pal(const string& s)
{
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
为什么函数参数const string&s而不仅仅是string&s?我翻过教科书,但似乎无法找到任何解释= /谢谢.
在C++或C++ 11中,对于以下声明//初始化,
// global scope
const int a = 1; // line 1
static const int b = 2; // line 2
constexpr int c = 3; // line 3
static constexpr int d = 4; // line 4
constexpr int e = a + b + c*d; // line 5
static constexpr int f = a - b - c*d; // line 6
Run Code Online (Sandbox Code Playgroud)
这个问题说在文件范围内,C++中第1行和第2行之间没有区别.3号线和4号线怎么样?
4号线和5号线之间是否存在差异?
5号线和6号线之间有区别吗?
这是我第一次处理一个比简单的write-single-source-file-and-compile例程稍微复杂一点的CUDA项目.正如所料,我面临着C标题的一些问题,即重复的符号.
根据链接器,在多个.cu文件中包含以下头文件会产生冲突:
env_vars.h
#ifndef ENV_VARS_H_
#define ENV_VARS_H_
/*** GLOBAL VARIABLES ***/
unsigned int h_n_osc;
__device__ unsigned int d_n_osc;
/*** CONSTANTS ***/
const double OMEGA_0 = 6.447421494058077e+09;
/* other constants defined in the middle */
#endif
Run Code Online (Sandbox Code Playgroud)
multigpu.cu
#include "env_vars.h"
/* assigns h_n_osc */
Run Code Online (Sandbox Code Playgroud)
adm_matrix.cu
#include "env_vars.h"
/* uses h_n_osc */
Run Code Online (Sandbox Code Playgroud)
在Nsight Eclipse Edition中构建项目会导致链接器抱怨h_n_osc变量被定义两次:
duplicate symbol _h_n_osc in:
./adm_matrix.o
./multigpu.o
ld: 1 duplicate symbol for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
通过互联网搜索,我意识到将h_n_osc变量的声明移动到multigpu.cu并将其重新声明为extern变量adm_matrix.cu(以及我以后可能需要它的任何地方)解决了问题,事实上它确实存在. …
这是我的代码片段:
class modbus {
public:
static const uint8_t modbusHeader = 2;
static const uint8_t modbusCRC = 2;
static const uint8_t modbusPDU = modbusHeader + modbusCRC;
static const uint8_t exceptionBase = 0x80;
static const uint32_t transmitTimeout = 5000;
};
Run Code Online (Sandbox Code Playgroud)
它为我需要在类中创建的modbus数据包定义了一些大小。我在嵌入式环境中工作,因此大小优化和注意事项始终存在。因此,我确实希望在闪存的只读部分中仅出现一次这些常数值。
我选择将这些变量设置为,static但这是否必要?编译器是否会推断这些值仅需要在二进制文件中保存一次,因此在删除static关键字时仅将它们包括一次?