相关疑难解决方法(0)

如何在#define之类的宏扩展后运行GCC预处理器来获取代码?

是否有一个选项,GCC预处理器可以生成C源代码并过滤掉不相关的源代码?

例如,一个.c文件有一个#define开关来定义许多不同的平台.我只对一个平台感兴趣,我希望C预处理器过滤掉不相关的代码.

GCC是否支持这一点?

gcc

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

查看编译器扩展代码 - C++

我了解到编译器会在编译时扩展宏.模板也在编译时扩展.有没有办法看到这个扩展的代码?我正在使用Visual Studio 2008进行编译.

有什么想法吗?

c++ compiler-construction macros templates

11
推荐指数
3
解决办法
4918
查看次数

预处理器布鲁斯有什么治疗方法吗?

我知道我可以踢预处理器以-E在我的特定情况下使用该选项吐出输出.对于生成的代码,这个预处理器输出是杀气腾腾的.例如,我有一个4gl的应用程序,而Informix将它转换为C,这反过来又吐出了一个可怕的丑陋混乱.

我想要的是一个编辑器,它允许我指定有效的预处理器值,并只显示相关代码.我有一些在Vim的匹配非常基本的工作#ifdef#endif,但代码是充满了更先进的结构是这样的#ifndef,#if#else.更糟糕的是,构造在逻辑上更复杂,我认为我的Vim脚本技能不足以让我得到我想要的东西.例如:

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif
Run Code Online (Sandbox Code Playgroud)

如果我想解决它,包括定义表达式求值程序.这必须是一个解决的问题!如果您有Vim建议或其他建议,请告诉我.

c vim c-preprocessor

9
推荐指数
2
解决办法
2685
查看次数

处理一些指令而留下其他指令

我用来通过C代码有很多#ifdef,#if并且#endif指令保持一些部分活动,一些部分不活动取决于一些变量是否定义.我搜索了一些可以处理它们以生成最终C代码的东西.但是预处理对于#include和也是如此#define.但我想保留它们.

那么,有什么东西可以通过一些过滤来预处理这些文件或项目吗?

c c-preprocessor

7
推荐指数
1
解决办法
196
查看次数

单独的特定#ifdef分支

简而言之:我想从当前的源代码生成两个不同的源树,仅基于一个预定义宏定义而另一个未定义,而没有对源进行其他更改.

如果你有兴趣,这是我的故事......

一开始,我的代码很干净.然后我们制作了一个新产品,是的,它更好.但代码只看到相同的外围设备,所以我们可以保持相同的代码.

好吧,差不多.

有一个小条件需要改变,所以我补充说:

#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif
Run Code Online (Sandbox Code Playgroud)

...到一个且只有一个源文件.在一般的all-source-files-include-this头文件中,我有:

#if !(defined(PRODUCT_A)||defined(PRODUCT_B))
#error "Don't make me replace you with a small shell script. RTFM."
#endif
Run Code Online (Sandbox Code Playgroud)

...除非他们明确定义了产品类型,否则人们无法编译它.

一切都好.哦...除了修改,组件改变,并且由于新硬件工作得更好,我们可以重新编写控制系统.现在,当我查看代码的表面时,有超过60个单独的区域:

#ifdef PRODUCT_A
...
#else
...
#endif
Run Code Online (Sandbox Code Playgroud)

...或者相同,但是PRODUCT_B.甚至:

#if defined(PRODUCT_A)
...
#elif defined(PRODUCT_B)
...
#endif
Run Code Online (Sandbox Code Playgroud)

当然,有时候理智需要更长的假期,并且:

#ifdef PRODUCT_A
...
#endif
#ifdef PRODUCT_B
...
#endif
Run Code Online (Sandbox Code Playgroud)

这些条件包装了一到两百行(您认为最后一行可以通过切换头文件来完成,但函数名称必须相同).

疯了吧.我最好在源代码库中维护两个独立的基于产品的分支并移植任何常见的更改.我现在意识到这一点.

是否存在可以生成我需要的两个不同源树的东西,仅基于PRODUCT_A被定义和PRODUCT_B未定义(反之亦然),而不接触任何其他东西(即没有包含头,没有宏扩展等)?

c-preprocessor

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

前预处理

我想要一个C预处理器,它从源代码中过滤掉一些#define语句,而不改变任何其他内容.

为什么?如果源被分发给另一个客户端,这应该用于从源中删除一些客户端特定的代码.

有谁知道现有的解决方案?

谢谢!西蒙

c preprocessor filtering

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

使用预处理器部分处理文件

我们继承了一个非常卷积的项目(500kloc)和许多预处理器条件逻辑,其中大部分不再相关,我想要清理它.

我是否可以使用预处理器¹仅扩展某些条件逻辑,并将所有其他预处理器宏,定义和包含在输出中?

¹在这里,通过"预处理器",我的意思是"任何工具",标准C预处理器,我可以安装的东西,甚至是黑客攻击的Perl或Python脚本.


例如,假设我们有这组代码:

#include <foo>
#define baz
#define bar(a) do{(a)+1} \
               while(0)
#ifdef X
  #if Y > 20
    #if Z > 5
      so_far_so_good = true;
    #endif
    #ifdef baz
    something();
    #endif
  #else
    otherthing();
  #endif
#else
  #if Z > 10
    wow().this.is.bad;
  #endif
#endif
Run Code Online (Sandbox Code Playgroud)

我想要的工具(如果它不存在则可能需要编写)将是CPP的一个版本,它不仅接受特定调用的定义列表,而且还接受在扩展期间要遵守的定义列表.任何不在第二个列表中的预处理程序符号都是完全不管的.一个例子是按顺序:

cpptreadlight -DY=22 --only=Y
Run Code Online (Sandbox Code Playgroud)

会产生:

#include <foo>
#define baz
#define bar(a) do{(a)+1} \
               while(0)
#ifdef X
    #if Z > 5
      so_far_so_good = true;
    #endif
    #ifdef baz
    something();
    #endif
#else
  #if Z > 10
    wow().this.is.bad; …
Run Code Online (Sandbox Code Playgroud)

c c++ c-preprocessor

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

使用sed进行多行删除

我正在尝试使用sed删除所有出现的

#ifdef _WIN32

#endif
Run Code Online (Sandbox Code Playgroud)

#ifdef和#endif之间存在的所有内容都是空行.我使用sed的经验有限,我已经阅读了关于多线功能的一些文档,但我似乎无法弄明白.任何帮助表示赞赏!

sed

5
推荐指数
2
解决办法
3146
查看次数

如何摆脱大型c项目中的ifdef

我得到了一个用C编码的开源项目.它使用#ifdef进行交叉编译.整个源代码中有很多ifdef.我想只为一个平台修改它.我想通过编译器的预处理器(Visual C++)来运行它,但它会将预处理的结果写入一个我不需要的文件.有人知道一种方法来预处理项目,保持其结构完整(所有文件完好无损)?请不要grep.

编辑:

我发现了一个潜在的解决方案(这些天你可以在互联网上找到它真是太棒了).它是boost.wave - 一个C++预处理器库,可以做一些有趣的事情.我不知道结果如何,但我会尝试一下.不过,这不是最终答案,所以如果你有解决方案,那么我会很高兴听到它.

c conditional-compilation visual-c++ c-preprocessor

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

从代码库中删除/应用ifdef的/ else的工具

我有一个非常大的代码库,我想通过删除并应用散布在它周围的一些ifdef来清理它.例如,我有很多这样的:

test.c的

#ifdef MYCHECK
    // do other sutff
#else
    // do stuff
#endif
Run Code Online (Sandbox Code Playgroud)

是否有一个工具允许我运行整个代码库并删除所有代码,只留下我的变量条件中的代码?例如:

nicetool -D MYCHECK *.c
Run Code Online (Sandbox Code Playgroud)

会导致:

test.c的

// do other stuff
Run Code Online (Sandbox Code Playgroud)

c preprocessor-directive

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

如何使用 gcc/g++ 预处理器去除不活动的 #if 指令?

我正在使用第三方开源项目,需要去掉不活动的 #ifs、#ifdefs 等以更好地理解代码流程。

有没有办法使用 make 来生成没有这些指令的源文件版本?我想避免扩展宏,只需删除指令即可。

我正在查看 https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

看起来 -dD 和 -fdirectives-only 是不错的开始选择。

这些预处理过的文件会出现在哪里呢?在哪里添加这些命令以与 Makefile 和“make”一起使用?我尝试运行“make -n”来生成脚本,并在 -Wformat 等之后向脚本中的 g++ 和 gcc 调用添加选项,但我没有注意到任何事情。

我不确定这是否会使任何事情变得复杂,但我也在使用 avr-gcc 和 avr-g++。

我查看了 coan,它不支持 #included #defines,因此它无法用于此目的,并且我无法让 sunifdef 工作。有没有办法用预处理器来做到这一点。

这些定义分散在当前文件、包含的文件以及指定 -Dfoo=opt 选项的包含的 makefile 中。

c c++ gcc

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

将 C 文件导出到新文件时,删除 #if 0 和 #endif 之间的代码

我想删除toy.c文件中的所有评论。从从 C/C++ 代码中删除注释我看到我可以使用

gcc -E -fpreprocessed -P -dD toy.c
Run Code Online (Sandbox Code Playgroud)

但是我的一些代码(比如我不想编译的弃用函数)被包裹#if 0和之间endif,就好像它们被注释掉了一样

  • 一方面,上面的命令不会删除这种类型的“注释”,因为它只能在宏扩展期间删除,从而-fpreprocessed防止;
  • 另一方面,我还有其他不想扩展的宏,因此删除-fpreprocessed是一个坏主意。

我在这里看到了一个困境。有没有办法摆脱这种情况?谢谢。


以下玩具示例“toy.c”足以说明问题。

#define foo 3  /* this is a macro */

// a toy function
int main (void) {
  return foo;
  }

// this is deprecated
#if 0
int main (void) {
  printf("%d\n", foo);
  return 0;
  }
#endif
Run Code Online (Sandbox Code Playgroud)

gcc -E -fpreprocessed -P -dD toy.c

#define foo 3
int main (void) {
  return …
Run Code Online (Sandbox Code Playgroud)

c gcc text-processing comments c-preprocessor

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

是否有#ifdef剥离C/C++实用程序

有没有可以删除说#ifdef PRO_VERSION ... #endif代码的实用程序?

请不要告诉我有关Visual Studio编译器标志或XCode视图后处理源的信息.我无法像控制台应用程序那样方便地自动化它.

我在这里要做的是找到一个现有的实用程序,如果它存在.如果不是......我想我必须重新发明轮子.

c c++ conditional-compilation c-preprocessor

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