2013-08-22 1 views
1

Могу ли я иметь что-то подобное?Использовать значение переменной char * в макросах

#include <stdio.h> 

#define CAT2(a1, a2) #a1 ## ";" ## #a2 

int main(void) 
{ 
    const char *ch1 = "1"; 
    const char *ch2 = "2"; 
    puts(CAT2(ch1, ch2)); 
} 

Выход:

1; 2

Но в настоящее время у меня есть

ч1; ch2

+0

Ваше использование '##' также неверно. Этот оператор предназначен для объединения токенов в действительные другие токены, а не для строк. Если бы это было для строковых литералов, вам не обязательно их присоединять, смежные строковые литералы всегда соединяются на более поздней стадии компиляции. –

ответ

1

К сожалению, так как макросы выучиваются во время компиляции, вы не можете использовать значения ваших переменных, это главный ограничивающий фактор с макросами. То есть они не могут оценить значения времени выполнения.

1

Вы не можете выполнять конкатенацию строк с помощью макросов так, как вы хотите.

Использование snprintf для того, чтобы подготовить строку:

char tmp[20]; 
snprintf(tmp, sizeof(tmp), "%s;%s", ch1, ch2); 

Макросы расширены во время компиляции, до фактической компиляции, и он не может знать значения времени выполнения.

Вы можете обернуть над кодом функцию, возвращающую tmp (просто не забудьте сделать статическую переменную tmp, чтобы предотвратить утечку).

char* cat2(char *ch1, char* ch2) 
{ 
    static char tmp[50]; 
    snprintf(tmp, sizeof(tmp), "%s;%s", ch1, ch2); 
    return tmp; 
} 

// inside main 
puts(cat2(ch1, ch2)); 
2

# operator заменить параметр, задаваемый ему в строкового литерала.

Это означает, что:

#define TO_STR(arg) #arg 

const char* ch1 = "1"; 
TO_STR(ch1) // <- Will give "ch1" 

От стандарта:

16.3.2 оператор # [cpp.stringize]

строка символов буквальным является строка-буквал без префикса. Если в списке замещения перед параметром сразу предшествует токен предварительной обработки #, оба они заменяются одним символом препроцессорной символьной строки, который содержит написание последовательности токенов предварительной обработки для соответствующего аргумента.

Так что в вас случае, вы пытаетесь конкатенации (с ## operator):

"ch1" ## ";" ## "ch2" 

Это объясняет результат, который вы получите.

Поскольку MACRO вычисляются при предварительной обработке, вы не можете объединять переменные так, как вы этого хотите.

Если вы находитесь на C, вы должны использовать, например, strcat.

Если вы находитесь на C++, почему бы вам не использовать std::string или в C++ 11 вы можете использовать snprintf.

Смежные вопросы