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

问题描述

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编译的问题,但是我不太懂这个。
请教各位如果不使用这种写法,该怎么写达到我预计的效果?

谢谢各位!

解决方案

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

解决方案二:

#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)";

解决方案三:

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

#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");

解决方案四:

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

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

时间: 2025-01-24 05:49:07

c++-C++宏定义字符串时出错的相关文章

C语言宏定义使用技巧

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义-- 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef unsigned char boolean: /* Boolean value type. */ typedef unsigned l

关于哈夫曼编码的程序运行时出错,我分析是由于cd定义出现了问题,导致后边cd[--start]出错

问题描述 关于哈夫曼编码的程序运行时出错,我分析是由于cd定义出现了问题,导致后边cd[--start]出错 void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){ //w存放n个字符的权值(均>0),构造赫夫曼树 HT,并求出n个字符的赫夫曼编码 HC printf("123"); system("pause"); int s1,s2,i,start; int f=0

vector定义-定义元素为int数组的vector时出错: vector<int [10]> vec;

问题描述 定义元素为int数组的vector时出错: vector<int [10]> vec; 为什么不能这样定义?请问错在哪里? 正常的定义方式是vector> vec; 但是vector为什么不能直接存放数组呢?非常疑惑,求大神解答- 解决方案 vector<int *> vector<vector<int>> 这两个试试看 解决方案二: 像老曹那样,定义指针 解决方案三: int数组不是模版类型. 你这个需要双层vector vector>

宏定义的黑魔法 - 宏菜鸟起飞手册

宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多.但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加.如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身可能并不漂亮优雅XD).但是因为宏定义对于很多人来说,并不像业务逻辑那样是每天会接触的东西.即使是能偶尔使

OC中的宏 和 C中的预编译宏定义

1.先来几个常用的: [csharp] view plain copy // 是否高清屏   #define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)   // 是否模拟器   #define isSimulator (

宏定义中的##操作符和... and _ _VA_ARGS_ _

1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co

C语言宏定义##连接符和#符的使用

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP "

c/c++中宏定义##连接符 和#符的使用

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号.比如下面代码中的宏:#define WARN_IF(EXP)    do{ if (EXP)    fprintf(stderr, "Warning: " #EXP &

Objective-C 宏定义详细介绍_IOS

喜欢读一些开源项目源码的人,总是会发现,大神的代码中总是有那么一些简短而高效的宏定义,点击进去一看,发现晦涩难懂,别说学习了,有时候理解都是一种困难,但是宏定义本身并没有那么难,但是写出一个好的宏当然还是需要丰富的经验和技术,接下来就说一说宏定义,看懂大神的宏是第一步,偶尔写一个也是装逼的好办法- 定义: 宏定义分为两种:一种是对象宏(object-like macro)另一种就是函数宏(function-like macro) 根据名字也可以理解到,对象宏就是用来定义一个量,通过这个宏可以拿到