使用C预处理器时,可以像这样将字符串化为字符串:
#define TO_STRING(x) "a string with " #x
Run Code Online (Sandbox Code Playgroud)
所以使用时,结果如下:
TO_STRING(test) 将扩展到: "a string with test"
有没有办法做相反的事情?获取字符串文字作为输入参数并生成C标识符?例如:
TO_IDENTIFIER("some_identifier") 会扩大到: some_identifier
谢谢您的回答.
编辑:对于那些想知道我需要它的人:
我想通过字符串标识符来引用我的3D引擎的场景图中的节点,但同时避免在紧密循环中比较字符串.所以我想我会写一个简单的工具,它将在编译的预构建步骤中运行并搜索预定义的字符串 - 例如ID("something").然后,对于每个这样的令牌,它将计算括号之间的字符串的CRC32,并生成包含这些数字标识符的#defines的头文件.例如,对于字符串"something",它将是:
#define __CRC32ID_something 0x09DA31FB
然后,每个cpp文件将使用ID(x)宏包含生成的头文件.本ID("something")当然会扩大到__CRC32ID_something,所以在效果是什么,编译器会看到的是简单的整数标识符,而不是对人友好的字符串.当然,现在我只是满足于此,ID(something)但我认为使用引号会更有意义 - 一个不知道ID宏如何工作的程序员可以认为something没有引号是C标识符,而实际上这样的标识符不存在于所有.
可能重复:
#ifff在#define中
如何在宏内成功使用"#"字符?当我做那样的事情时,它会尖叫:
#define DO(WHAT) \
#ifdef DEBUG \
MyObj->WHAT() \
#endif \
Run Code Online (Sandbox Code Playgroud) 我理解如何使用这样的预处理器指令:
#if SOME_VARIABLE
// Do something
#else
// Do something else
#endif
Run Code Online (Sandbox Code Playgroud)
但是,如果我只想做某事,如果不是SOME_VARIABLE那会怎么样呢.
显然我仍然可以这样做:
#if SOME_VARIABLE
#else
// Do something else
#endif
Run Code Online (Sandbox Code Playgroud)
...离开if,但有没有办法:
#if not SOME_VARIABLE
// Do something
#endif
Run Code Online (Sandbox Code Playgroud)
这里的 Apple文档没有提示,但这似乎是一个非常基本的需求.
基本上我想做预处理器相当于:
if(!SOME_VARIABLE)(
{
// Do Something
}
Run Code Online (Sandbox Code Playgroud) iphone objective-c ios c-preprocessor preprocessor-directive
如何在构建设置中定义预处理器宏,如IPAD_BUILD和IPHONE_BUILD(以及如何在我的工厂方法中使用它们)?
我现在正在用这些,想知道背后会发生什么事情会很酷.
macros objective-c conditional-compilation ios c-preprocessor
对于相同的预处理指令,这是一个多重问题.
除了在MSDN中找到的信息:
1.a:两种符号之间有什么区别?
1.b:所有编译器都以同样的方式实现它们吗?
1.c:你什么时候使用<>,什么时候会使用""(即你用什么标准来使用一个或另一个标题包括在内)?
我已经看到至少有两种写作方式包括一个项目标题.考虑到您至少有4种类型的标题,即:
对于每种标题:
2.a:你会用<>或""吗?
2.b:您是否只使用{TheProject/TheHeader.hpp}或{TheHeader.hpp}?
3.a:你是否在一个类似树的组织中使用源和/或标题的项目(即目录中的目录,而不是"一个目录中的每个文件"),有什么优点/缺点?
出于某种原因,我需要暂时禁用头文件中的某些宏,这#undef MACRONAME将使代码编译,但它将取消现有的宏.
有没有一种方法可以禁用它?
我应该提到你并不真正了解宏的值,而且我正在寻找交叉编译器解决方案(至少应该在GCC和MSVC中工作).
在此站点上看到,代码显示了使用括号中的波浪号进行的宏调用:
HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~))
// ^^^
Run Code Online (Sandbox Code Playgroud)
它是什么意思/做什么?我怀疑它只是一个空洞的争论,但我不确定.它是否特定于C(99),就像__VA_ARGS__C99特有的并且存在于C++中一样?
我正在实现X宏,但我有一个简单的宏扩展问题.通过在this文章中包含,该宏(见下文)用于几个宏用法示例.编译器给出了一条错误消息,但我可以通过使用-E带有GCC编译器的标志来查看有效的C代码.
宏X列表定义如下:
#define LIST \
X(red, "red") \
X(blue, "blue") \
X(yellow, "yellow")
Run Code Online (Sandbox Code Playgroud)
然后:
#define X(a, b) foo.##a = -1;
LIST;
#undef X
Run Code Online (Sandbox Code Playgroud)
但是gcc给出了以下错误消息:
lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
Run Code Online (Sandbox Code Playgroud)
就像我说的,我可以通过使用-Egcc上的开关看到有效的C代码:
lixo.c:42:1: error: pasting "." and "red" does not give a …Run Code Online (Sandbox Code Playgroud) 我想做的事情如下:
#ifdef GCC
#define GetFunctionName() string("My function name is ") + __PRETTY_FUNCTION__;
#endif
Run Code Online (Sandbox Code Playgroud)
由于我想使用漂亮的PRETTY_FUNCTION,据我所知只有gnu支持所以我需要检测我是否正在编译g ++和MinGW,我该怎么做?我猜我需要知道的是编译器的预处理器定义,就像我在下面为Microsoft做的那样.
#ifdef WIN32
#define LogFuncBegin() gLogger.FuncBegin( __FUNCTION__ );
#define LogFuncEndSuccess() gLogger.FuncEndSuccess( __FUNCTION__ );
#endif
Run Code Online (Sandbox Code Playgroud)
如何在C++预处理器中检测g ++和MinGW?
c-preprocessor ×10
c++ ×6
macros ×4
c ×3
ios ×2
objective-c ×2
g++ ×1
gcc ×1
gnu ×1
iphone ×1
mingw ×1
tilde ×1
visual-c++ ×1