2
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

非常感谢您的任何建议,

4

5 回答 5

6

您需要一个格式说明符,请查看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";
于 2012-12-26T03:52:39.343 回答
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)
于 2012-12-26T04:35:02.517 回答
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);

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

安德鲁

于 2012-12-26T03:53:11.000 回答
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; 
}
于 2012-12-26T04:23:50.880 回答
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__);}
于 2018-04-20T07:38:34.857 回答