从#define函数返回字符串

时间:2013-12-17 23:54:12

标签: c string function c-preprocessor

我知道您可以在 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));
}

我知道有一些解决方法(比如使用第一个程序)。我只想知道是否可能

4 个答案:

答案 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"