【发布时间】:2015-09-25 05:17:33
【问题描述】:
在代码中,我有以下声明
#if GCC == 1
#define SET_STACK(s) asm("movl temp,%esp");
...
#endif
在代码中,恰好在一个地方使用了这个宏,编译器在该行上指示undefined reference to 'temp'。
temp = (int*)some_pointer;
SET_STACK(temp);
temp 变量被声明为全局 volatile void 指针
volatile void* temp;
内联汇编有语法问题吗?
据我了解,内联程序集尝试加载 temp 的值(不是取消引用的值,而是指针本身)
【问题讨论】:
-
有没有;在#define 的末尾?以前没见过
-
@UnderDog:分号不在定义后面,它是宏值的一部分。如果使用
SET_STACK宏,将插入asm指令,包括分号。 -
@mastov:是的,但这是错误的,可能会破坏条件语句。
-
@Olaf:是的,考虑到它的使用方式,这是不必要的(不会说“错误” - 你只需要注意它)。只是说,分号与
#define指令的语法无关。根据您的计划,您甚至可能需要分号。 -
@mastov:(没有讨论“
#define语法”,我什至没有提到。“......它可以有一个目的”:还在等待一个例子。唯一的目的这里的分号是把一个表达式变成一个语句。因为“调用者”已经给出了,所以实际上会有两个。两个相邻的分号有什么目的(除了引起麻烦) ?
标签: c pointers x86 cygwin inline-assembly