2013-12-17 4 views
0

Я знаю, что вы можете вернуть строку символов из нормальной функции в C как в этом кодеВозвращение символьной строки из #define функции

#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)); 
} 

Я знаю, что существуют обходные пути (например, с помощью первой программы). Я просто хочу знать, если это возможно

+1

Короткий ответ: Вы не можете. Не запутайтесь, макрофункция не работает как функция. –

ответ

0

Вы ничего не возвращаете из макроса #define d. Грубо говоря, препроцессор C заменяет макросообщение текстом тела макроса, причем аргументы текстово подставляются в их позиции. Если вы хотите макрос, чтобы назначить указатель на "dog" и оценки к указателю, вы можете сделать это:

#define dogpointer(p) ((p)="dog") 
1

Думая о «#define функции» является ИМО, неправильный способ приблизиться к этим.

#define - это тупой инструмент, который составляет текст поиска/замены. Он ничего не знает о C++ как языке, и замена выполняется до того, как какой-либо из ваших реальных кодов даже посмотрел.

То, что вы написали, само по себе не является функцией, это часть текста, которая выглядит как одна, и она помещается туда, где вы написали псевдоним.

Если вы хотите # определить, что вы только что сделали, это нормально (я не проверял ваш пример конкретно, но в общем случае использование #define для вызова функции и подстановка аргументов возможно), но подумайте дважды перед делая это, если у вас нет удивительной причины. А потом подумайте еще раз, пока не решите не делать этого.

1

Вы не можете «вернуть» из макроса. Ваша лучшая (ugh ... возможно, «лучшая», но в любом случае) ставка заключается в том, чтобы сформулировать ваш макрос таким образом, чтобы он оценивал выражение, которое вы хотите получить. Например:

#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 \ 
}) 

Но если вы к этому моменту вы могли бы просто написать правильную функцию.

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" 
Смежные вопросы