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
非常感谢任何建议,
答案 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__);}