我知道您可以在 C 中返回正常函数中的字符串,如此代码
#include <stdio.h>
char* returnstring(char *pointer) {
pointer="dog";
return pointer;
}
int main(void)
{
char *dog = NULL;
printf("%s\n", returnstring(dog));
}
但是,我找不到能够在#define
函数中返回字符串的方法,就像在此代码中一样
#include <stdio.h>
#define returnstring(pointer) { \
pointer="dog"; \
return pointer; \
}
int main(void)
{
char *dog = NULL;
printf("%s\n", returnstring(dog));
}
我知道有一些解决方法(比如使用第一个程序)。我只想知道是否可能
答案 0 :(得分:1)
考虑“#define函数”,IMO是一种错误的方法。
#define是一种钝器,相当于文本查找/替换。它对C ++作为一种语言几乎一无所知,并且在你的任何真实代码被查看之前就完成了替换。
你所写的内容本身并不是一个功能,它是一段看起来像一个的文本,它放在你写别名的地方。
如果你想#define你刚刚做了什么,那很好(我没有具体检查你的例子,但一般来说,使用#define进行函数调用并且可以替换参数),但是在做之前要三思而后行除非你有一个惊人的理由。然后再考虑 ,直到你决定不这样做。
答案 1 :(得分:1)
您无法从宏“返回”。你最好的(呃...可以说是“最好的”,但无论如何)赌注是以这样的方式表达你的宏,它评估你想要成为结果的表达。例如:
#define returnstring(ptr) ((ptr) = "hello world")
const char *p;
printf("%s\n", returnstring(p));
如果您有多个表达式语句,可以使用可怕的逗号运算符将它们分开:
#define even_more_dangerous(ptr) (foo(), bar(), (ptr) = "hello world")
如果您正在使用GCC或兼容的编译器,您还可以利用名为“语句表达式”的GNU扩展,以便将整个(非表达式)语句嵌入到宏中:
#define this_should_be_a_function(ptr) ({ \
if (foo) { \
bar(); \
} else { \
for (int i = 0; i < baz(); i++) { \
quirk(); \
} \
} \
ptr[0]; // last statement must be an expression statement \
})
但如果你达到这一点,你也可以真正写出一个合适的功能。
答案 2 :(得分:0)
您不会从#define
d宏返回任何内容。粗略地说,C预处理器将宏调用替换为宏体的文本,并将参数文本替换为其位置。如果您希望宏指定一个指针"dog"
并评估指针,您可以这样做:
#define dogpointer(p) ((p)="dog")
答案 3 :(得分:0)
事情是returnstring
,因为宏没有按照它所说的去做;它还将值赋给参数。该函数按原样执行,即使它(有点奇怪)使用其参数作为临时变量。
该功能相当于:
char* returnstring(char *ignored) {
return "dog";
}
功能宏与以下内容非常相似:
#define returnstring(pointer) pointer = "dog"
这引出了一个问题,为什么不称之为assign_string
?
或者为什么不只是:
#define dogString "dog"
写下:
int main(void)
{
char *dog = NULL;
printf("%s\n", dog = dogString);
}
assignString的函数是:
char* assignstring(char **target{
*target= "dog";
return *target;
}
然后你可以有一个宏:
assign_string_macro(pointer) assignstring(&pointer)
最终如果你想“在#define函数中返回字符串”,那么你只需要:
#define returnstring(ignored) "dog"