相关疑难解决方法(0)

如何从C宏的值创建一个char字符串?

例如,如何避免两次写'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 dry c-preprocessor

50
推荐指数
2
解决办法
10万
查看次数

C宏来创建字符串

替代标题(以帮助搜索)

  • 将预处理程序标记转换为字符串
  • 如何从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)

但预处理器不评估""内的任何内容

  1. 有没有解决的办法?
  2. 这甚至是个好主意吗?

c macros stringification c-preprocessor

30
推荐指数
6
解决办法
2万
查看次数

在C++预处理器中为参数添加引号

我想将包含文件的名称作为编译器参数传递,以便我可以修改大量配置参数.但是,我的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++ c-preprocessor double-quotes

23
推荐指数
2
解决办法
2万
查看次数

C宏:显然无用宏的优点/意图

我在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)

完全被这个宏的观点困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么.我错过了什么吗?

c macros

21
推荐指数
2
解决办法
947
查看次数

如何在连接之前引起宏扩展?

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

c stringification c-preprocessor

11
推荐指数
1
解决办法
2083
查看次数

字符串中的GCC宏扩展参数

我有这种情况

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

这里内部宏已经扩展.我真的不确定我做错了什么.有什么建议?

c macros gcc

6
推荐指数
2
解决办法
6095
查看次数

C 嵌套宏

为什么嵌套宏在一种情况下有效,而在另一种情况下则无效?

情况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)

c c-preprocessor

6
推荐指数
1
解决办法
9972
查看次数

C预处理器字符串怪异

我正在定义一个宏,它计算为一个常量字符串,保存文件名和行号,用于记录目的.

它工作正常,但我无法弄清楚为什么需要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__作品?

c stringification c-preprocessor

5
推荐指数
1
解决办法
3441
查看次数

标签 统计

c ×7

c-preprocessor ×6

macros ×3

stringification ×3

c++ ×1

double-quotes ×1

dry ×1

gcc ×1