草庐IT

C++标准

全部标签

c++ - 类与结构的内存布局如何

我来自C编程,其中结构中的数据首先是顶级变量,然后是第二个、第三个等等。我现在正在用C++编程,我正在使用一个类。我基本上想要达到同样的效果,但我也想要get/set方法,也许还有其他方法(我也想尝试以C++风格来做,可能会学到一些新东西)。是否有保证,例如公共(public)变量将首先在内存中,然后是私有(private)变量? 最佳答案 Isthereaguaranteee.g.thatthepublicvariableswillbefirstinmemorythentheprivatevariable?不,这样的保证没有做出-

c++ - 使用 extern "C"链接的过载解决方案

在混合的C/C++项目中,我们需要从C调用C++函数。要调用的函数被重载为三个独立的函数,但我们可以从C端忽略它,我们只选择最合适的并坚持使用那个。有两种方法可以做到这一点:(1)编写一个带有extern"C"函数的小型C++包装器,将调用转发给选定的重载函数,或者(2)仅声明我们想要的一个函数的hackish方法以extern"C"的形式从C调用。问题是,选择第二种变体是否有任何缺点(除了噩梦和恶业)?换句话说,给定三个重载函数,其中一个被声明为exern"C",我们是否应该预料到C++方面的问题,或者这是否根据标准明确定义? 最佳答案

c++ - 我是否需要一个 extern "C" block 来包含标准 POSIX C header ?

我是否需要extern"C"{}block来在C++程序中包含标准Cheader。只考虑在C++中没有对应物的标准C头文件。例如:extern"C"{#include#include} 最佳答案 系统C头文件通常已经包含一个extern"C"block,由#ifdef__cplusplus保护。这样,函数在编译为C++时会自动声明为extern"C",您无需手动执行此操作。例如在我的系统上unistd.h和fcntl.h以__BEGIN_DECLS开始并以__END_DECLS结束,它们是在sys/cdefs.h中定义的宏:/*C+

c++ - 按位非 (~) 的奇怪行为

如何解释以下行为?#includeusingnamespacestd;intmain(){unsignedchara=8;cerr>6;cerr>6;cerr输出:a:8b:255c:3经过进一步测试,(~a)似乎变成了int而不是unsignedchar。这就是1移入的原因。这是怎么回事?编辑:我的编译器只是标准的gcc4.1.2 最佳答案 C中的所有算术运算符和按位运算符如果最初是较短的整数类型,则总是将它们的参数扩展到至少int。这就是语言的定义方式。语言规范将此称为“积分提升”。(这样做的根本原因是为了更容易在硬件不支持对比

使用标准库和HAL库的STM32单片机进行串口通信/解决因例程为HAL库的传感器,而其他模块都是标准库,需要将数据用串口传送给标准库的单片机的相关问题

(本文使用STM32F103C8T6,在CubeMX里演示用的是RBT6,但实际上引脚是一样的)        本文着重解决一个大工程中,某些传感器的例程是HAL库的,而其他模块(或算法)都是标准库,导致难以移植的问题。本文的解决方法是:使用一片单片机用HAL库(CubeMX)配置例程,然后用串口将传感器数据传给标准库进行处理。        首先,配置CubeMX,这是我一个项目的某个模块配置的工程,其中,本文使用光学传感器进行演示(什么传感器不重要),通信协议为IIC,串口使用UART2。        传感器的接法:将SDA,SCL,VCC,GND依次接好即可,上图有INT/SDA/SC

c++ - C和C++中存储和显示的地址有什么区别?

在C中,如果我创建一个变量并像这样打印它的地址:inta;intmain(void){printf("%p",&a);return0;}输出为:00AAC++中的同一程序使用以下行:cout输出是:0x8f970aa这两者有什么区别?我使用TurboC编译了这两个程序。 最佳答案 除非您使用一些特殊的、特定于系统的链接器文件,否则无法保证您的变量最终将位于内存中的哪个地址。它甚至可能在同一个编译器上从一个编译到另一个编译在不同的地方结束。当然,不同的编译器会有不同的行为。没有标准说明他们应该如何分配变量。这与C与C++无关。这两个标

c++ - 字符串字母的排列 : How to remove repeated permutations?

这是一个打印字符串字符排列的标准函数:voidpermute(char*a,inti,intn){intj;if(i==n)printf("%s\n",a);else{for(j=i;j它工作正常但有一个问题,它还打印了一些重复的排列,例如:如果字符串是“AAB”输出是:AABABAAABABABAABAA这也有3个重复条目。有什么办法可以防止这种情况发生吗?--谢谢阿洛克克尔 最佳答案 记下您之前交换了哪些字符:charwas[256];/*for(j=0;j这必须是迄今为止条目中最快的一个,一些关于“AAAABBBCCD”(10

c++ - 为什么在 g++ std::intmax_t 中不是 __int128_t?

我的问题很简单:因为std::intmax_t根据cppreference定义为maximumwidthintegertype,为什么不对应GCC中的__int128_t? 最佳答案 我认为这违反了C和C++标准——或者gcc不考虑__int128_t是一个整数类型。C标准(1999版和2011版)不需要intmax_t成为标准类型之一;它必须是“能够表示任何有符号整数类型的任何值的有符号整数类型”。特别是,它可以是一个扩展整数类型——如果有一个128位扩展整数类型,那么intmax_t必须至少为128位宽。C标准甚至建议使用实现定

Eigen 按行和按列计算矩阵的均值和标准差

  使用Eigen库实现矩阵按行和按列的平均值可以使用rowwise()和colwise()函数实现,具体代码如下:#include#includeintmain(){Eigen::Matrixfloat,3,4>mat;mat1,2,3,4,5,6,7,8,9,10,11,12;//按行求平均值Eigen::VectorXfrow_mean=mat.rowwise().mean();std::cout"按行求平均值:\n"row_mean.transpose()std::endl;//求解每一行的平均值std::coutmat.row(0).mean()"";std::coutmat.row

c++ - C++ 标准到底在哪里说取消引用未初始化的指针是未定义的行为?

到目前为止,我找不到如何推断出以下内容:int*ptr;*ptr=0;是未定义的行为。首先,5.3.1/1指出*表示将T*转换为T的间接寻址。但这并没有说明任何关于UB的事情。然后经常引用3.7.3.2/4说在非空指针上使用释放函数会使指针无效,以后使用无效指针是UB。但是在上面的代码中没有任何关于释放的内容。UB如何在上面的代码中推导出来? 最佳答案 第4.1节看起来像一个候选(强调我的):Anlvalue(3.10)ofanon-function,non-arraytypeTcanbeconvertedtoanrvalue.If