我试图在c中编写一个宏,它在自身中嵌入一个字符串,并在运行时返回指向该字符串的指针。
inline.c:4:1: error: expected identifier or ‘(’ before ‘{’ token
{(char* var = 0;
^
inline.c: In function ‘main’:
inline.c:17:23: error: expected expression before ‘,’ token
write(0, STR("hello"), 6);
我收到了错误:
{{1}}
我无法弄清楚如何解决这个问题;欢迎任何帮助。
答案 0 :(得分:2)
您使用的是哪种编译器?
GCC(可能是Clang作为GCC兼容性功能)有一个扩展名Statements and declarations in expressions,它使用了符号:
({ … })
您似乎正在尝试使用以下内容,其中的字符顺序相反:
{( … )}
这些符号都不是标准C。
另外,如问题所示,代码:
#define STR(str)
{(char* var = 0;
asm volatile( \
"call after_string%=\n" \
".ascii " str "\n" \
".byte 0\n" \
"after_string%=:\n" \
"pop $0\n" \
: "=m" (var) );
var;
)}
似乎缺少一些反斜杠:
#define STR(str) \
{(char* var = 0; \
asm volatile( \
"call after_string%=\n" \
".ascii " str "\n" \
".byte 0\n" \
"after_string%=:\n" \
"pop $0\n" \
: "=m" (var) ); \
var; \
)}
这使得块成为一个宏。如上所述,它是一个具有空扩展的宏,后跟一个语句块,其中第一个包含的语句以左括号开头。如果您希望它是一个语句表达式,则需要使用:
#define STR(str) \
({char* var = 0; \
asm volatile( \
"call after_string%=\n" \
".ascii " str "\n" \
".byte 0\n" \
"after_string%=:\n" \
"pop $0\n" \
: "=m" (var) ); \
var; \
})
我保留判断结果是否有效的判断 - 我从未发现有必要在代码中嵌入汇编程序,因为我使用便携式软件。