在printf语句中连接字符串

时间:2012-12-26 03:43:24

标签: c printf

gcc 4.7.2
c89

您好,

#define LOG_ERR(fmt, ...)                                               \
    fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n", __func__, __LINE__, strerror(errno), ##__VA_ARGS__)

我正在使用它:

LOG_ERR("Failed to connect to message queue [ %d ]", msg_id);

fmt已在fprintf语句中连接。这怎么可能?

为了测试这个概念,我试图用下面的代码做同样的事情,但是因为编译错误而失败了:

/* Using char array */
const char name[] = "Joe";

printf("Hello how " name " how are you today?\n");

Using constant string literal
const char *name = "Joe";

printf("Hello how " name " how are you today?\n");

两个游戏都有以下错误:

expected ')' before name

非常感谢任何建议,

5 个答案:

答案 0 :(得分:6)

您需要格式说明符,请查看documentation for printf

const char *name = "Joe"; // or your char array, either's fine

printf("Hello how %s how are you today?\n", name);

您的尝试:

printf("Hello how " name " how are you today?\n");

看起来更多C ++ ish

cout << "Hello how " << name << "are you today?\n";

答案 1 :(得分:4)

区别在于宏在文本上用字符串替换单词fmt。将两个或多个文字字符串放在一起可以获得这些字符串的串联。

"Hello " "World" "!!"
/* is the same as */
"Hello World!!"

请注意,只有文字字符串才能执行此操作。 适用于变量。

将宏视为代码中的查找/替换。为了说明,请考虑您的宏定义 -

#define LOG_ERR(fmt, ...)  \
    fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n",
            __func__, __LINE__, strerror(errno), ##__VA_ARGS__)

当你像这样使用它时 -

LOG_ERR("Failed to connect to message queue [ %d ]", msg_id);

它进行文本替换并变为 -

fprintf(stderr, "[ERROR] %s:%d: error [%s] " "Failed to connect to message queue [ %d ]" "\n",
            __func__, __LINE__, strerror(errno), msg_id)

并排的字符串和连接和瞧 -

fprintf(stderr, "[ERROR] %s:%d: error [%s] Failed to connect to message queue [ %d ]\n",
            __func__, __LINE__, strerror(errno), msg_id)

答案 2 :(得分:3)

当它失败时,这是因为你正在使用变量。字符串文字可以由编译器连接,即如果你写“abc”“123”,那么编译器会将其视为“abc123”。当你在宏中执行此操作时,预处理器意味着这正是发送给编译器的内容

LOG_ERR("Failed to connect to message queue [ %d ]", msg_id);

变得

fprintf(stderr, "[ERROR] %s:%d: error [%s] " "Failed to connect to message queue [ %d ]" "\n", myfunction, 123, strerror(errno), msg_id);

也可能值得检查字符串化器和连接宏(对于预处理器 - ###而且我永远不记得哪个是......)
  安德鲁

答案 3 :(得分:1)

如果你想为fprintf()定义一个宏,你可以这样做,这是最简单的恕我直言。

#define LOG_ERR(...)   fprintf(stderr, __VA_ARGS__)

并像

一样使用它
int main()
{

    int  myVar =100;

    LOG_ERR ("The value of myVar is %d", myVar); 

    return 0; 
}

答案 4 :(得分:0)

#include <stdio.h>
#include <sys/time.h>
#include <string>

#define MyPrint(...) {\
struct timeval tv;\
gettimeofday(&tv,0);\
printf("%d.%d:", (unsigned int)tv.tv_sec, (unsigned int)tv.tv_usec);\
printf(__VA_ARGS__);}