用于在C中将符号与变量值连接在一起的预处理器指令

问题描述 投票:1回答:4

这是在C中完成符号连接的方式。

#define conc(a,b) a ## b

例如:

[conc(hello,World)将使符号为helloWorld

我需要知道的有点不同。假设存在一个包含一些整数的变量n。现在,我需要通过将另一个符号与value of n串联来创建一个符号。

例如:

n = 2我需要定义一些function(...),以便function(symbol,n)将给出symbol1(不是symboln),当n = 3function(symbol,n)将给出symbol3等...

如何定义类似的东西?


这是我真正想要实现的。首先,在AtmelStudio中使用它来对atmega微控制器进行编程。这里有4个USART模块,因此还有单独的一组寄存器,这些寄存器仅通过模块的编号更改名称。

例如,四个模块中的四个波特率寄存器为UBRR0LUBRR1LUBRR2LUBRR3L。 (还有更多,请参见下文)。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS90ZGs1QS5wbmcifQ==” alt =“在此处输入图像描述”>

我需要编写一个函数来通过设置相关寄存器的值来初始化给定模块。由于寄存器名称仅因模块号而异,因此,如果我可以按照本文中的要求定义一些预处理程序指令,则可以编写一个函数,用一些符号表示寄存器名称,因此这些符号将带有相关的寄存器名称,并且一切都会好起来的。

例如:

如果我可以定义conc(a,b)来完成我需要的功能,则为简单功能

void init(int no){
    conc(UBRR,no) = 0xF0;
}

将能够用来代表以下所有内容;

UBRR0 = 0xF0;
UBRR1 = 0xF0;
UBRR2 = 0xF0;
UBRR3 = 0xF0;

如果无法实现,我唯一知道的就是重新编写四个单独的函数。但希望会有更好的选择。.

这是在C中完成符号连接的方式。#define conc(a,b)a ## b例如:conc(hello,World)将使符号helloWorld。我需要知道的是有些不同。假设有一个变量n ...

c macros c-preprocessor avr-gcc
4个回答
5
投票

预处理器将在您的代码上,编译之前以及显然在运行时间之前运行。因此,没有任何预处理程序指令可以解决您的目的。

最接近的匹配将使用如下所示的切换用例:


4
投票

您无法使用C预处理程序来完成此操作,因为变量的值是在运行时确定的。但是您可以使用snprintf()在运行时根据数字构建字符串。


2
投票

在我看来,寄存器(例如RXC0,RXC1,RXC2等)是等距的。如果这个假设是正确的,那么您可以计算以下寄存器的地址(只需用寄存器的类型替换rint):


0
投票

真正的窍门如下:

© www.soinside.com 2019 - 2024. All rights reserved.