- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的问题的要点:我的项目由 C 和 C++ 文件组成,需要一些字符串常量(它们在项目的 C 部分用 #define
硬编码)通过 USB 连接到计算机,但如果我连接两个或多个相同类型的设备,它们将停止响应,因为这些常量相同。此问题的解决方案是从 C++ 文件动态分配这些常量,以便 C++ 代码中的变量可以到达使用这些值的 C 部分。
我现在拥有的值在 C header 中定义为 #define IDENTIFIER VALUE
(硬编码),其中 VALUE
是一个 C
原始常量,一个 int
,如 0x1234
或 char
数组,如 "Some字符串”
。例如:
#define IDENTIFIER1 0x1234
#define IDENTIFIER2 0x5678
#define IDENTIFIER3 "Some string"
#define IDENTIFIER4 "Another string"
我知道 C 中的方法将这些标识符与其他宏(例如 LOBYTE
和 HIBYTE
)一起使用,并且值也会传递给某些函数。
我尝试通过将字符串 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
和一些 questions 的 answers 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 代码。
问题:
如果我可以提高我的问题的清晰度,请告诉我!
非常感谢@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 toVALUE
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()
或类似的函数将参数的字符复制到该数组中。但是,您可以对数字或指针变量使用简单赋值。
- 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++ 方法可以被认为是一种函数。
- 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.
这个问题没有意义。如果你有一个常量,那么你不能给它赋值(注意赋值给不同于初始化)。如果你想在编译时设置它的值,你可以使用文件范围的 const
或 static const
变量,但无论如何使用的宏已经完成了。为什么要去所有的工作去改变?
另一方面,如果您想在运行时分配给它们,则需要 non-const
变量。此外,如果您想在一个源文件中赋值,而该值将从另一个源文件中读取,则需要外部变量(非静态
)。
- 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/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!