2 u012552444 u012552444 于 2016.04.17 17:29 提问

C++宏定义字符串时出错

在用xcode写cocos2d的程序时,遇到一个问题,当调试环境是mac时,需要的文件路径为绝对路径,调试环境是iphone时,文件路径直接是文件名就可以了。为了解决这个问题,尝试写了一下宏。如下:
#define RUN_IN_IOS

#define TO_STRING(_string) #_string
#ifdef RUN_IN_IOS
#define GET_FILE(_fileName) TO_STRING(_fileName)
#else
#define GET_FILE(_fileName) TO_STRING(/Users/aaa/Resource/##_fileName)
#endif

调用的方式为:
string ttfPath = GET_FILE(Marker.ttf);

结果报错为:
Pasting formed '/Marker', an invalid preprocessing token

查询之后发现可能是clang编译的问题,但是我不太懂这个。
请教各位如果不使用这种写法,该怎么写达到我预计的效果?

谢谢各位!

4个回答

caozhy
caozhy   Ds   Rxr 2016.04.17 17:54

给字符串加上引号试试看。

webcq
webcq   2016.04.17 19:23

#define TO_STRING(_string) #_string
#ifdef RUN_IN_IOS
试试
#define GET_FILE(_fileName) TO_STRING(_fileName)
#else
#define GET_FILE(_fileName) TO_STRING("/Users/aaa/Resource/"##_fileName)
#endif

调用的方式为:
string ttfPath = GET_FILE("Marker.ttf)";

webcq
webcq   2016.04.17 19:31

不好意思,写错了,用下面的方式:

#define RUN_IN_IOS

#ifdef RUN_IN_IOS
#define GET_FILE(_fileName) _fileName
#else
#define GET_FILE(_fileName) "/Users/aaa/Resource/"##_fileName
#endif

调用的方式为:
char * pstr=GET_FILE("Marker.ttf");

u012552444
u012552444 这个写法好像不行 最后读到的结果是 "/Users/aaa/Resource/""Marker.ttf"
2 年多之前 回复
u012552444
u012552444   2016.04.17 23:07

谢谢各位已经解决了 最后写成了这样 虽然没有解决原来的疑惑 但总归是解决了问题

#ifdef RUN_IN_IOS
static string GET_FILE(string _fileName)
{
    return _fileName;
}
#else
static string GET_FILE(string _fileName)
{
    string path1 = "/Users/aaa/Resources/";
    return path1+_fileName;
}
#endif

调用方法是
GET_FILE("Marker.ttf")

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中,利用宏定义一个字符串和字符数组定义的字符串其末尾都会自动添加\0字符
C语言中, 利用宏定义一个字符串#define MYPHONE "AT+CMGS" 字符数组的方式来定义一个字符串unsigned char SMS[]="HELLO, WELCOME TO RCCTS!"; 问题:这两种字符串定义方式下,在最后末尾都会自动添加字符'\0'吗? 以下是验证程序 #include #define MYPHONE "A
宏定义\字符串 多行书写时换行
字符串常量定义时的换行问题     如果我们在一行代码的行尾放置一个反斜杠,c语言编译器会忽略行尾的换行符,而把下一行的内容也算作是本行的内容。这里反斜杠起到了续行的作用。     构建较长的字符串是续行的常见用途, 还有一个作用是定义跨行的宏。     如果我们不使用反斜杠,当我们试图初始化一个跨多行的字符串是,c语言编译器就会发出警告。如下面的语句所示: char letters[
将C语言宏定义转换成字符串!
适用场景举例 流媒体处理系统中,采样率是个很重要的参数,很多地方都要用,如果用来分配内存,则 #define SAMPLE_RATE 16000 如果用来配置第三方库,则 #define SAMPLE_RATE "16000" 这样每次改采样率都要改两处地方,容易遗漏 网上搜到第一篇文章,匆忙试了试,并未达到我想要的效果,然后在GNU的官网找到了第二篇文章,看懂了,原来第一篇文
C语言宏定义中的字符串替换
 ## 是连接符号,连接两个字符串#是把名字代替成参数中的字符串 #define PRINTF(value)  printf( #value " = %d/n", value );  #define FUNC(arg) void print##arg(void)  {   printf(#arg " = %d", arg); } FUNC(size);  展开后生成代码:v
关于C语言define宏定义字符串常量
问题由来: 本人一直以为宏对于字符串的处理也是直接在预处理时进行替换;但是最近在工作中遇到了字符串宏+1的情况;于是彻底的颠覆了以前的思维;于是乎进行测试验证得出以下结果。 /*测试*/ #include<stdio.h> #define LUOJIAN "luojian" int main() { printf("%s\n",LUOJIAN+1);
c中如何输出一个宏定义的字符串?
做如下宏定义: #define Macro Test #define PrintStr(str) #str #define PrintMacro(str) PrintStr(str) 则 PrintMacro(Macro)即为“Test” 则 std::cout 回输出 Test
将C语言宏定义转换成字符串
适用场景举例流媒体处理系统中,采样率是个很重要的参数,很多地方都要用,如果用来分配内存,则[cpp] view plain copy#define SAMPLE_RATE 16000 如果用来配置第三方库,则[cpp] view plain copy#define SAMPLE_RATE "16000" 这样每次改采样率都要改两处地方,容易遗漏网上搜到第一篇文章,匆忙试了试,并未达到我想要的
C/C++中 宏定义字符串 操作
关于记号粘贴操作符(token paste operator): ##1. 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。   其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格   解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,   被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些   
C语言 输入字符串,按照宏定义形式输出相应字符串
输入字符串,输出按照宏定义格式输出 例如: 输入: 2 wide.1.2. ..length..0;/ 输出: WIDE_1_2 LENGTH_0 代码实现(编译器:cygwin64):#include<iostream> #include<vector> #include<string> using namespace std; class Test{ publ
C中多个宏字符串拼接
之前在做两个字符串的拼接,一般都是用strcat函数, 即使是宏定义的字符串。 比如定义了宏A, B, 第一反应会用 A"other"这样的拼接方式, 却不会没反应过来 A B 也可以做拼接。 基础不扎实,好二好二。 宏字符串可以这样拼接: #define A "xxx" #define B "yyy" void main() { char* str = A B; pri