gpt4 book ai didi

c++ - 替换 C 代码宏并在 C++ 代码中定义常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:22 32 4
gpt4 key购买 nike

我的问题的要点:我的项目由 C 和 C++ 文件组成,需要一些字符串常量(它们在项目的 C 部分用 #define 硬编码)通过 USB 连接到计算机,但如果我连接两个或多个相同类型的设备,它们将停止响应,因为这些常量相同。此问题的解决方案是从 C++ 文件动态分配这些常量,以便 C++ 代码中的变量可以到达使用这些值的 C 部分。

我现在拥有的值在 C header 中定义为 #define IDENTIFIER VALUE(硬编码),其中 VALUE 是一个 C 原始常量,一个 int,如 0x1234char 数组,如 "Some字符串”。例如:

#define IDENTIFIER1 0x1234
#define IDENTIFIER2 0x5678
#define IDENTIFIER3 "Some string"
#define IDENTIFIER4 "Another string"

我知道 C 中的方法将这些标识符与其他宏(例如 LOBYTEHIBYTE)一起使用,并且值也会传递给某些函数。

我尝试通过将字符串 defines 替换为包含在 #ifndef 中的 static cast char[] 变量定义来解决这个问题,但编译器指出标识符在某些函数中初始化非常量变量或作为参数传递。

我成功编译了代码,其中我将定义字符串从 #define IDENTIFIER VALUE 更改为 static const unsigned char IDENTIFIER[] = VALUE;,但我仍然需要定义它们在 C++ 中。

但是我很难定义像 0x1234 这样的十六进制数。我找到了其他 question包括与我的问题相关的内容,到目前为止,我已尝试通过以下方式定义十六进制值( found out that uint8_t is just a typedef of unsigned char ,还发现了一些关于将数字转换为 unsigned char 和一些 questionsanswers to questions about casting types ) :

static uint8_t IDENTIFIER[] = {0x12, 0x34, 0};

static const uint8_t IDENTIFIER[] = {0x12, 0x34, 0};

static const uint8_t IDENTIFIER[] = (uint8_t*)0x1234;

static const uint16_t identifier_int = 0x1234;
static const unsigned char IDENTIFIER[3] = identifier_int;

有一个函数使用 IDENTIFIER 作为参数,它的原型(prototype)是这样的:

void foo (uint8_t *bar, /*other arguments*/);

后来这样称呼:

foo(IDENTIFIER, /*other arguments*/)

我想要实现的目标:值应该在 C++ 代码中定义,它应该使用某种方法将这些值传递给 C 代码。

问题:

  1. 将值从 C++ 代码传递到 C 代码的最佳方法是什么?有哪些替代方案?

如果我可以提高我的问题的清晰度,请告诉我!

非常感谢@AhmedMasud 帮助我更清楚地定义我的问题并提供一些提示来澄清问题。

最佳答案

Values should be defined in C++ code, where it should use some method to pass those values to C code and then define them.

您当然可以在一般意义上这样做,但要使其与您现有的 C 代码一起工作将需要更改该代码。这些变化可能非常重要。

If I understand correctly macros change all places where IDENTIFIER is used to VALUE before compilation,

是的,这是一个相当好的特征。

therefore I think that macros shouldn't be used anymore.

我拿你的意思是,因为要在运行时设置值,所以不能使用宏。说的很对。在 C 代码中适应这一点的破坏性最小的方法可能是声明并使用外部变量来保存值。但是请注意,要将 C 代码转换为以这种方式工作,您可能需要解决各种各样的问题。

I expect code to look something like

void setIdentifier(identifier)
{
#ifndef IDENTIFIER
static const unsigned char IDENTIFIER[] = identifier;
#endif
}

as far as I know const should already do it.

不,它看起来根本不像那样。

首先,您说您不想使用宏是有道理的。在那种情况下,#ifndef IDENTIFIER#endif 没有作用。

其次,您在函数内声明了变量 IDENTIFIER,因此它没有链接。如果您希望一个函数设置它并由另一个函数读取它,您需要一个外部变量。

第三,由于您需要一个外部变量,您将无法使用初始化器来设置它的值。如果将变量声明为 char 数组(与 char * 相对),则需要使用 strcpy()或类似的函数将参数的字符复制到该数组中。但是,您可以对数字或指针变量使用简单赋值。

  1. I don't know much about interacting with C code from C++ yet, what is best way to pass values from C++ code to C code? What alternatives there are?

与在 C++ 代码中传递值的替代方法几乎相同:将值存储在可访问的变量中,或将其作为函数参数传递。 C 没有“方法”,但出于这个目的,C++ 方法可以被认为是一种函数。

  1. What precautions should I take when assigning those "constants"? I noticed that it is recommended to use static const instead of #define, as mentioned above using macros in this situation probably is unlikely.

这个问题没有意义。如果你有一个常量,那么你不能给它赋值(注意赋值给不同于初始化)。如果你想在编译时设置它的值,你可以使用文件范围的 conststatic const 变量,但无论如何使用的宏已经完成了。为什么要去所有的工作去改变?

另一方面,如果您想在运行时分配给它们,则需要 non-const 变量。此外,如果您想在一个源文件中赋值,而该值将从另一个源文件中读取,则需要外部变量(非静态)。

  1. Would static const defined in C++ program be seen in C code?

在文件/命名空间范围内,不,因为在该上下文中阻止它是 static 的确切目的。在函数或方法内部,不,因为函数/方法的局部变量在声明它们的函数/方法之外是不可见的。所以,不。

如果您想要一个函数或方法可以写入并且另一个函数或方法可以从中读取的变量,并且至少有一个访问该变量的函数是用 C 实现的,那么您需要一个文件范围的外部变量.这样的变量通过以下形式的文件范围声明声明给所有用户(包括 C 和 C++):

/* "extern" is essential */
extern int IDENTIFIER1;

这通常会放在一个头文件中,所有访问该变量的源都包含该头文件。此外,项目中只有一个源文件必须定义变量,代码如下:

/*
* either the initializer or the absence of "extern" is essential;
* both together is good form.
*/
int IDENTIFIER1 = 0x1234;

关于c++ - 替换 C 代码宏并在 C++ 代码中定义常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47658595/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com