例如,如何避免两次写'func_name'?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
Run Code Online (Sandbox Code Playgroud)
我想遵循单点真相规则.
C预处理器的版本:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
Run Code Online (Sandbox Code Playgroud) 替代标题(以帮助搜索)
- 将预处理程序标记转换为字符串
- 如何从C宏的值创建一个char字符串?
我想在编译时使用C #define来构建文字字符串.
该字符串是为调试,发布等而更改的域.
我想要一些这样的事情:
#ifdef __TESTING
#define IV_DOMAIN domain.org //in house testing
#elif __LIVE_TESTING
#define IV_DOMAIN test.domain.com //live testing servers
#else
#define IV_DOMAIN domain.com //production
#endif
// Sub-Domain
#define IV_SECURE "secure.IV_DOMAIN" //secure.domain.org etc
#define IV_MOBILE "m.IV_DOMAIN"
Run Code Online (Sandbox Code Playgroud)
但预处理器不评估""内的任何内容
我想将包含文件的名称作为编译器参数传递,以便我可以修改大量配置参数.但是,我的C++构建是通过类似进程的makefile来删除传递给编译器和预处理器的参数的引号.我希望做一些相当于的事情
#ifndef FILE_ARG
// defaults
#else
#include "FILE_ARG"
#endif
Run Code Online (Sandbox Code Playgroud)
使用我的命令行包括-DFILE_ARG = foo.h.这当然不起作用,因为预处理器不翻译FILE_ARG.
我试过了
#define QUOTE(x) #x
#include QUOTE(FILE_ARG)
Run Code Online (Sandbox Code Playgroud)
由于同样的原因不起作用.
出于脚本原因,我宁愿在命令行上执行此操作,也不要在相应的例程中编辑包含行.有什么办法吗?
我在C编程方面有一些经验,但我不敢称自己精通.最近,我遇到了以下宏:
#define CONST(x) (x)
Run Code Online (Sandbox Code Playgroud)
我发现它通常用于表达式,例如:
double x, y;
x = CONST(2.0)*y;
Run Code Online (Sandbox Code Playgroud)
完全被这个宏的观点困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么.我错过了什么吗?
#define JNI_DECLARE( classname, methodname ) \
classname ## methodname( JNI* env )
#define JAVA_CLASS Java_com_example
void JNI_DECLARE( JAVA_CLASS, open ) {}
Run Code Online (Sandbox Code Playgroud)
这扩展到:
void JAVA_CLASS_open( JNI* env ) {}
Run Code Online (Sandbox Code Playgroud)
如何得到:
void Java_com_example_open( JNI* env ) {}
Run Code Online (Sandbox Code Playgroud)
?
我有这种情况
#define PRE 0xF1
#define SR0 0B0000
#define SR1 0B0001
#define SR2 0B0010
#define SR3 0B0011
#define VIOTA(A0) asm(".byte PRE, A0")
int main()
{
VIOTA(SR1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有一个顶级宏扩展,但扩展包含更多的宏.这些没有扩大并导致一些问题.
我希望的行为是最终的扩张
asm(".byte 0xF1,0B0000")
这里内部宏已经扩展.我真的不确定我做错了什么.有什么建议?
为什么嵌套宏在一种情况下有效,而在另一种情况下则无效?
情况1:
#define name(val) #val
#define name2(front, back) name(front ## back)
...
printf("%s\n", name2(foo, bar)); // foobar
Run Code Online (Sandbox Code Playgroud)
案例2:
#define paste(front, back) front ## back
#define name(val) #val
#define name2(front, back) name(paste(front, back))
...
printf("%s\n", name2(foo, bar)); // paste(foo, bar)
Run Code Online (Sandbox Code Playgroud) 我正在定义一个宏,它计算为一个常量字符串,保存文件名和行号,用于记录目的.
它工作正常,但我无法弄清楚为什么需要2个额外的宏 - STRINGIFY而且TOSTRING,当直觉暗示时__FILE__ ":" #__LINE__.
#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define THIS_ORIGIN (__FILE__ ":" TOSTRING(__LINE__))
int main (void) {
/* correctly prints "test.c:9" */
printf("%s", THIS_ORIGIN);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是一个丑陋的黑客.
具体是什么,这样逐步发生阶段有人能解释__LINE__正确字符串化,为什么既不__FILE__ ":" STRINGIFY(__LINE__)和__FILE__ ":" #__LINE__作品?