相关疑难解决方法(0)

C和C++代码之间不兼容

给定的C代码

#include <stdio.h>
int x = 14; 
size_t check()
{
   struct x {};
   return sizeof(x); // which x
}
int main()
{
    printf("%zu",check()); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的32位实现上给出4作为C的输出,而在C++中给出代码

#include <iostream>
int x = 14;    
size_t check()
{
   struct x {};
   return sizeof(x); // which x    
}
int main()
{
    std::cout<< check(); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出1.为何如此差异?

c c++ incompatibility

17
推荐指数
3
解决办法
809
查看次数

是否有GCC关键字允许结构重新排序?

我知道为什么GCC默认不重新排序结构的成员,但我很少编写依赖于结构顺序的代码,所以有什么方法可以标记我的结构自动重新排序?

c gcc c99 padding memory-alignment

17
推荐指数
2
解决办法
2393
查看次数

如何在C中定义函数数组

我有一个包含这样的声明的结构:

void (*functions[256])(void) //Array of 256 functions without arguments and return value
Run Code Online (Sandbox Code Playgroud)

在另一个函数我想定义它,但有256个函数!我可以这样做:

struct.functions[0] = function0;
struct.functions[1] = function1;
struct.functions[2] = function2;
Run Code Online (Sandbox Code Playgroud)

等等,但这太累了,我的问题是有办法做这样的事吗?

struct.functions = { function0, function1, function2, function3, ..., };
Run Code Online (Sandbox Code Playgroud)

编辑:Chris Lutz所说的修正了语法错误.

c arrays function definition

16
推荐指数
2
解决办法
3万
查看次数

带有枚举的结构在C和C++中有所不同,为什么?

任务是通过I2C将数据从Arduino发送到STM32.

所以我使用C++在Arduino中定义了Struct和Enums:

enum PhaseCommands {
    PHASE_COMMAND_TIMESYNC  = 0x01,
    PHASE_COMMAND_SETPOWER  = 0x02,
    PHASE_COMMAND_CALIBRATE = 0x03
};

enum PhaseTargets {
    PHASE_CONTROLLER = 0x01,
    // RESERVED = 0x02,
    PHASE_LOAD1 = 0x03,
    PHASE_LOAD2 = 0x04
};

struct saatProtoExec {
    PhaseTargets   target;
    PhaseCommands  commandName;
    uint32_t       commandBody;
} phaseCommand;

uint8_t phaseCommandBufferSize = sizeof(phaseCommand);

phaseCommand.target = PHASE_LOAD1;
phaseCommand.commandName = PHASE_COMMAND_SETPOWER;
phaseCommand.commandBody = (uint32_t)50;
Run Code Online (Sandbox Code Playgroud)

另一方面,我使用C得到了相同的定义:

typedef enum {
    COMMAND_TIMESYNC  = 0x01,
    COMMAND_SETPOWER  = 0x02,
    COMMAND_CALIBRATE = 0x03
} MasterCommands;

typedef enum {
    CONTROLLER = 0x01,
    // RESERVED = …
Run Code Online (Sandbox Code Playgroud)

c c++ struct arduino stm32

13
推荐指数
2
解决办法
1822
查看次数

理解32位C编译器中的sizeof(char)

(sizeof)char总是在32位GCC编译器中返回1.

但由于32位编译器的基本块大小为4,当基本大小为4字节时,char如何占用单个字节?

考虑以下因素:

struct st 
{
int a;
char c;
};
Run Code Online (Sandbox Code Playgroud)

sizeof(st)返回为8,默认块大小为4字节(因为分配了2个块)

我永远无法理解为什么sizeof(char)在分配大小为4的块时返回为1.

有人可以解释一下吗???

我会非常感谢任何回复解释它!

编辑:'bits'的拼写错误已更改为'bytes'.我对第一次编辑的人抱歉.我回滚了编辑,因为我没有注意到你做的改变.感谢所有那些指出必须改变的人,尤其是@Mike Burton,因为他们对这个问题进行了抨击,并且@jalf似乎对我对概念的理解得出了结论!

c c++ sizeof

11
推荐指数
3
解决办法
2万
查看次数

C/C++获得结构大小

今天,我惊讶地发现了这一点

当sizeof运算符应用于类,结构或联合类型时,结果是该类型的对象中的字节数,以及为在单词边界上对齐成员而添加的任何填充.结果不一定与通过添加各个成员的存储要求而计算的大小相对应.

我不知道它,我很确定这个东西打破了我的一些旧代码:读取二进制文件,我曾经有这样的结构:

struct Header
{
    union {
        char identc[4];
        uint32 ident;
    };
    uint16 version;
};
Run Code Online (Sandbox Code Playgroud)

fread通过sizeof以下方式直接读取这6个字节:

fread( &header, sizeof(header), 1, f );
Run Code Online (Sandbox Code Playgroud)

但现在sizeof(header)回来了8!


是否有可能sizeof(header)返回旧的GCC版本6,或者我的想法完全消失了?

无论如何是否有任何其他运算符(或预处理器指令或其他)让编译器知道结构有多大 - 不包括填充?

否则,从一个不需要编写太多代码的文件中读取原始数据结构的干净方法是什么?


编辑:我知道这不是读取/写入二进制数据的正确方法:根据机器的字节顺序和内容,我会得到不同的结果.无论如何,这种方法是最快的方法,我是juist试图读取一些二进制数据以快速获取其内容,而不是编写一个我将在未来使用或发布的好应用程序.

c c++ size sizeof data-structures

11
推荐指数
1
解决办法
6999
查看次数

C/C++:在结构中打包或填充数据

我正在使用Code :: Blocks IDE和GNU GCC编译器.

struct test
{
    char a;
    char e;
    char f;
    char b;
    char d;
};
Run Code Online (Sandbox Code Playgroud)

sizeof(test)回报5.

我读到了这个答案: 为什么结构的sizeof不等于每个成员的sizeof之和?

为什么最后没有填充char,所以sizeof(test)返回68?一旦我添加short等等int,我可以提出更多问题.但我认为这个问题现在很好.填充不会使处理器更容易使用结构吗?

c c++ padding

8
推荐指数
1
解决办法
337
查看次数

通过更改窗口大小获得不同的标头大小

我有一个C++程序将TCP标头表示为结构:

#include "stdafx.h"

/*  TCP HEADER

    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            | …
Run Code Online (Sandbox Code Playgroud)

c c++ struct packing

7
推荐指数
2
解决办法
2853
查看次数

C++ sizeof with bool

这是一个简单的问题.代码优先.

struct A {
    int x; 
};
struct B {
    bool y;
};
struct C {
    int x;
    bool y;
};
Run Code Online (Sandbox Code Playgroud)

在主要功能中,我打电话

cout << " bool : " << sizeof(bool) <<
     "\n int : " << sizeof(int) <<
     "\n class A : " << sizeof(A) <<
     "\n class B : " << sizeof(B) <<
     "\n class C : " << sizeof(C) << "\n";
Run Code Online (Sandbox Code Playgroud)

结果是

bool : 1
int : 4
class A : 4
class B : 1
class C …
Run Code Online (Sandbox Code Playgroud)

c++ boolean sizeof

7
推荐指数
1
解决办法
7031
查看次数

在结构中填充

我知道结构中填充(来自这篇文章的例子)

 struct A   -->8 bytes
 {
    char c;
    char d;
 //2 padding here
    int i;
 };
 struct B  -->12 bytes
 {
     char c;
 //3 padding here
    int i;
    char d;
 //3 padding here
 };
Run Code Online (Sandbox Code Playgroud)

现在,我不明白以下示例:

 typedef struct {  -->**shouldn't it be 12 bytes**
    int a;
    char *str;
 } TestS;

 TestS s;

int main(int argc, char *argv[]) {

   printf("An int is %lu bytes\n", sizeof( int )); -->4
   printf("A Char * is %lu bytes\n", sizeof( char …
Run Code Online (Sandbox Code Playgroud)

c struct

7
推荐指数
1
解决办法
2486
查看次数