首页 > 解决方案 > 使用批处理文件更改 .c 文件顶部的数字

问题描述

我需要为我的工作编译 400 多个 C 程序,源代码之间的唯一区别是代码第一行中的静态变量。

我想编写一个批处理文件,它会自动编辑和编译这 400 个程序,并将 .exe 文件保存在单独的文件夹中。

.exe 文件的编译和移动不是问题,但我不知道如何使用批处理文件在第一行增加这个静态变量。第一行是这样的:

#define PROGRAM_NUMBER   20

对于每个编译的程序,我需要将该数字从 1 更改为 400。
这可能吗?我怎样才能得到一个批处理文件来做到这一点?

在此先感谢您的帮助。

目前批处理文件如下所示:

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64

devenv "Project.vcxproj" /build Release

因为它们是需要编译的 Visual Studio 项目。

标签: cbatch-filecompilation

解决方案


您可以使用-D命令行选项将值从调用编译器的命令行传递给宏定义。

https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

-D name=definition 定义的内容被标记和处理,就好像它们出现在“#define”指令中的第三阶段一样。特别是,定义被嵌入的换行符截断。

如果您从 shell 或类似 shell 的程序调用预处理器,您可能需要使用 shell 的引用语法来保护字符,例如在 shell 语法中有意义的空格。

如果您希望在命令行上定义类似函数的宏,请在等号(如果有)之前用括号括住其参数列表。括号对大多数 shell 都有意义,因此您应该引用该选项。使用 sh 和 csh,-D'name(args...)=definition' 有效。

-D 和 -U 选项按照它们在命令行中给出的顺序进行处理。在所有 -D 和 -U 选项之后处理所有 -imacros 文件和 -include 文件选项。

即,如果您通常将其称为(非常简化),例如

gcc myfile.c

那么,如果你打电话给喜欢

gcc -D PROGRAM_NUMBER=20 myfile.c

它基本上会编译相同,但也好像文件以

#define PROGRAM_NUMBER 20

在第一行。

Basile 的不错推荐,引用:
With GCC compile with warnings and debug info,所以

gcc -Wall -Wextra -g -DPROGRAM_NUMBER=20

并使用GDB调试器
end-of-quote

这反过来意味着您不需要具有不同#defines 的文件的多个副本,您可以一遍又一遍地使用相同的副本。

我只是建议从这个健全性检查开始:

#ifndef PROGRAM_NUMBER
#error The PROGRAM_NUMBER has to be defined!
#endif

对于 Microsoft/D似乎可以解决问题:
https ://docs.microsoft.com/en-us/cpp/build/reference/d-preprocessor-definitions?view=vs-2019


推荐阅读