Sum*_*udu 1 c macros avr-gcc c-preprocessor
这是符号连接在C中完成的方式.
#define conc(a,b) a ## b
例如:
conc(hello,World)将成为符号helloWorld.
我需要知道的是有点不同.假设有一个n包含整数的变量.现在我需要通过将另一个符号与值相 连接来创建符号n.
例如:
n = 2
我需要定义一些function(...),这样function(symbol,n)会给symbol1(不symboln)和时n = 3,function(symbol,n)会给symbol3等等...
我该如何定义类似的东西?
这就是我真正想要实现的目标.首先,这将用于AtmelStudio编程atmega微控制器.那里有4个USART模块,因此是一组独立的寄存器,只能通过模块的编号来改变名称.
例如,在四个模块的四个波特率寄存器是UBRR0L,UBRR1L,UBRR2L,UBRR3L.(还有几个,见下文).

我需要编写一个函数来通过设置相关寄存器的值来初始化给定模块.由于寄存器名称仅因模块编号而异,如果我可以按照本文中的要求定义一些预处理器指令,我可以用一些符号编写一个表示寄存器名称的函数,因此符号将带有相关的寄存器名称和事情会好起来..
例如:
如果我可以定义conc(a,b)做我需要的,一个简单的功能
void init(int no){
conc(UBRR,no) = 0xF0;
}
Run Code Online (Sandbox Code Playgroud)
将能够用来代表以下所有内容;
UBRR0 = 0xF0;
UBRR1 = 0xF0;
UBRR2 = 0xF0;
UBRR3 = 0xF0;
Run Code Online (Sandbox Code Playgroud)
如果这是不可能实现的,那么我所知道的只是重写四个独立的功能.但希望有更好的选择..
预编译器将在编译之前对您的代码进行操作,并且显然在运行时之前.因此,没有预处理器指令可以解决您的目的.
最接近的匹配是使用如下的开关盒:
switch(n){
case 0: ptr=&symbol0; break;
case 1: ptr=&symbol1; break;
case 2: ptr=&symbol2; break;
case 3: ptr=&symbol3; break;
case 4: ptr=&symbol4; break;
case 5: ptr=&symbol5; break;
//etc... needs to be filled manually.
}
Run Code Online (Sandbox Code Playgroud)
然后继续*ptr......
此外,如果您的变量名称将是顺序的,为什么不具有数组,名称为符号并symbol0更改为symbol[0]?
编辑:现在看到问题中的编辑.你可以有开关的情况下,如上所示,也可以创建一个指针数组,这将保持UBRR0L,UBRR0L等等&然后用索引使用它.据我所知,它们只是寄存器并将出现在固定地址.
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |