在printf中使用#define?

时间:2010-06-10 02:17:39

标签: c++ string c-preprocessor

我想要为应用程序ID使用某种常量(所以我可以在printf中使用它)。

我有这个:

#define _APPID_ "Hello World!"

然后是简单的printf,将其调用为%s(字符串)。它说明了这一点:

simple.cpp:32: error: cannot convert ‘_IO_FILE*’ to ‘const char*’ for argument ‘1’ to ‘int printf(const char*, ...)’

我将使用什么来定义要在printf中使用的应用程序ID?我试过了:

static const char _APPID_[] = "Hello World"`

但它不起作用,我认为也是同样的错误。

4 个答案:

答案 0 :(得分:6)

我不确定我完全理解你的尝试......但是这样做有效:

#include <stdio.h>

#define _APPID_ "Hello world"

int main()
{
    printf("The app id is " _APPID_ "\n");
    /* Output: The app id is Hello world */
    return 0;
}

当呈现两个背靠背的常量字符串(即"hello " "world")时,编译器将它们视为单个连接的常量字符串("hello world")。

这意味着在尝试printf编译时常量字符串的情况下,您不需要 来使用printf("%s", _APPID_)(尽管这应该仍然有效)

答案 1 :(得分:2)

根据错误消息,问题很可能不是由字符串常量引起的,而是由printf()给出的错误参数引起的。

如果要打印到文件,则应使用fprintf(),而不是printf()。如果要打印到屏幕,请使用printf(),但不要将文件句柄作为其第一个参数。

答案 2 :(得分:0)

在source.h中

#ifndef _SOURCE_H
#define SOURCE_H
#ifdef APP_ID
#define WHOAMI printf("%s\n", APP_ID);
#endif
#endif

在你的计划中:

#define APP_ID __FILE__
#include "source.h"
int main()
{
    WHOAMI
    return 0;
}

这样做的原因是有一个stadnard include文件 - source.h。头文件中的__FILE__返回头文件的名称,因此APP_ID定义被限制为存在于C文件中。

如果您没有定义APP_ID,则代码将无法编译。

答案 3 :(得分:-1)

_APPID_是为实现保留的名称。它匹配模式^_[A-Z].*

将其重命名为例如APP_ID