我想创建一个C宏,它创建一个名称基于行号的函数.我以为我可以做类似的事情(真正的函数会在括号内有声明):
#define UNIQUE static void Unique_##__LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
我希望将扩展到以下内容:
static void Unique_23(void) {}
Run Code Online (Sandbox Code Playgroud)
这不起作用.使用令牌连接,定位宏按字面处理,最终扩展为:
static void Unique___LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
(是的,无论这看起来多么无用,我都有一个真正的理由要这样做).
我正在用C++创建一个宏来声明一个变量并为它赋值.根据宏的使用方式,宏的第二次出现可以覆盖第一个变量的值.例如:
#define MY_MACRO int my_variable_[random-number-here] = getCurrentTime();
Run Code Online (Sandbox Code Playgroud)
使用它的另一个动机是避免为变量选择某个名称,以使其与开发人员最终使用宏选择的名称相同.
有没有办法在C++中的宏内生成随机变量名?
- 编辑 -
我的意思是独特但也是随机的,一旦我可以在一个块中使用我的宏两次,在这种情况下,它将生成如下:
int unique_variable_name;
...
int unique_variable_name;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为了唯一,必须随机生成两个变量名.
这是符号连接在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; …Run Code Online (Sandbox Code Playgroud)