Использовать #define в printf? - PullRequest
2 голосов
/ 10 июня 2010

Я хотел использовать некоторую константу для идентификатора приложения (чтобы я мог использовать ее в 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? Я попробовал:

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

но это не сработало, я думаю, та же ошибка.

Ответы [ 4 ]

6 голосов
/ 10 июня 2010

Я не уверен, что точно понимаю, что вы пытались ... но это работает:

#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_) (хотя это все равно должно работать).

2 голосов
/ 10 июня 2010

Согласно сообщению об ошибке, проблема, скорее всего, вызвана не строковой константой, а неправильными параметрами, указанными для printf().

Если вы хотите напечатать файл, вам следует использовать1004 *, а не printf().Если вы хотите печатать на экран, используйте printf(), но не указывайте дескриптор файла в качестве первого параметра.

0 голосов
/ 10 июня 2010

_APPID_ - это имя, зарезервированное для реализации. Соответствует шаблону ^_[A-Z].*

Переименуйте его, например, в. APP_ID.

0 голосов
/ 10 июня 2010

В 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;
}

причина этого заключается в том, чтобы стандартный файл включения включал файл - source.h.__FILE__ внутри файла заголовка возвращает имя файла заголовка, поэтому определение APP_ID ограничено для использования в файле C.

Если вы не определите APP_ID, код не будет компилироваться.

...