2010-06-10 76 views
2

我想爲應用程序ID使用某種常量(所以我可以在printf中使用它)。在printf中使用#define?

我有這樣的:

#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"` 

但它沒有工作,我認爲同樣的錯誤。

+2

請您發佈實際的printf()行嗎?同時指出你正在使用的編譯器。 – 2010-06-10 02:22:41

+6

同樣的錯誤*「你認爲」*?它要麼是或者不是。你編譯的代碼,而不是我們。如果你不知道你得到了什麼錯誤,你期望別人怎麼樣? – jalf 2010-06-10 02:30:23

+1

'#define'和'printf()'?你確定這是一個C++的問題嗎? – MSalters 2010-06-10 08:47:40

回答

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

實際上,請使用'printf(「%s」,APP_ID)'。如果您將應用程序重命名爲「200%生產力增強」,調用'printf(APP_ID)'不會工作得太好。 – MSalters 2010-06-10 08:52:14

+0

如果您正在使用PRIuPTR或inttypes的其他格式化程序。h,printf(「text」PRIuPTR「more text」,4);是唯一的出路。 http://stackoverflow.com/questions/1403074/printf-with-sizeof-on-32-vs-64-platforms-how-do-i-handle-format-code-in-platfor – portforwardpodcast 2014-01-29 01:05:06

2

根據錯誤消息,問題很可能不是由字符串常量引起的,而是由給出的錯誤參數printf()引起的。

如果要打印到文件,應該使用fprintf()而不是printf()。如果要打印到屏幕,請使用printf(),但不要將文件句柄作爲其第一個參數。

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包括文件 - source.h。頭文件中的__FILE__返回頭文件的名稱,所以APP_ID定義被限制在C文件中。

如果您未定義APP_ID,代碼將無法編譯。

-1

_APPID_是爲實現保留的名稱。它匹配模式^_[A-Z].*

將它重命名爲例如APP_ID