我有一个创建函数的宏(程序集标签) 定义为
define make(name) asm ("%0: hlt" :: "m"(name));
但是为了调用这个函数,我必须先导入它,如
make(exit);
extern "C" void exit()
为什么宏declare (import)
不能用于函数?
答案 0 :(得分:1)
使用行继续反斜杠可以在宏中轻松拥有多行:
#define MAKE(name) \
asm ("%0: hlt" :: "m"(name)); \
extern "C" void (name)();
线路延续的作用只是使整个事物成为一条线。所以当它扩展时:
MAKE(foo)
它将扩展为单行:
asm ("%0: hlt" :: "m"(foo)); extern "C" void (foo)();
如上所述,在宏中使用它们当然存在缺点。最值得注意的是,你不能将它作为非支撑循环或if
中的语句。但是对于像你想要的那样的宏来说它并不重要,因为无论如何它可能会在全球范围内使用(或者它没有多大意义)。