使用批处理文件更改 .c 文件顶部的数字

Posted

技术标签:

【中文标题】使用批处理文件更改 .c 文件顶部的数字【英文标题】:Using a batch file to change a number at the top of a .c file 【发布时间】:2020-06-11 05:17:30 【问题描述】:

我的工作需要编译超过 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 项目。

【问题讨论】:

您知道大多数编译器的-D 命令行选项吗? 不,我不是。我从命令行运行编译器的经验很少。 没问题。但是您确实从批处理文件中调用它,不是吗?请说明具体情况,然后我可以针对您的情况做出更具体的回答。 您目前正在做什么来编译这些文件?也就是说,给我们一些可以使用的东西。例如您是否已经有一个批处理文件来执行一些构建步骤并且需要知道如何扩展它? 编辑了主要问题以显示我如何使用 .bat 进行编译。 【参考方案1】:

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

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

-D 名称=定义 定义的内容被标记和处理,就好像它们出现在“#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 的推荐,引用: 使用GCC 编译带有警告和调试信息,所以

gcc -Wall -Wextra -g -DPROGRAM_NUMBER=20

并使用GDB 调试器 引用结束

这反过来意味着您不需要多个具有不同#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

【讨论】:

我已编辑问题以显示我当前如何在批处理文件中编译项目。 已添加MS提示,正在尝试查找详细信息。 使用GCC 编译带有警告和调试信息,所以gcc -Wall -Wextra -g -DPROGRAM_NUMBER=2 并使用GDB 调试器 假设你不介意@BasileStarynkevitch 提到/D 的相同文档也确认应该支持#ifndef...#endif#error - docs.microsoft.com/en-us/cpp/preprocessor/…【参考方案2】:

就像 gcc 有一个-D 命令行选项一样,MSVC 有一个/D

https://docs.microsoft.com/en-us/cpp/build/reference/d-preprocessor-definitions?view=vs-2019

但是,devenv 不支持/D 开关。解决方法是设置CL 环境变量,供CL 编译器使用。

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

SET CL=/DPROGRAM_NUMBER#20

devenv "Project.vcxproj" /rebuild Release

您不能使用 /D 选项来定义使用等号 (=) 的符号。相反,您可以使用数字符号 (#) 作为等号。通过这种方式,您可以使用 CL 或 CL 环境变量来定义具有显式值的预处理器常量——例如,/DDEBUG#1 来定义 DEBUG=1。

https://docs.microsoft.com/en-us/cpp/build/reference/cl-environment-variables

如果 PROGRAM_NUMBER 是一个计数器(例如,从 1 到 400),那么您可以使用 for 循环而不是将行复制 400 次。

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

for /L %%a in (1,1,400) do (
    echo Building program %%a
    SET CL=/DPROGRAM_NUMBER#%%a
    devenv "Project.vcxproj" /rebuild Release
)

/rebuild 需要用于强制编译器构建项目,即使所涉及的文件实际上并未被编辑。

Counting in a FOR loop using Windows Batch script

按照@Yunnosch 的建议,将以下检查添加到您的代码中,以确保定义了PROGRAM_NUMBER

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

【讨论】:

感谢您的意见。请相信我自己为我的答案找到了该信息。虽然比你晚一点。 如果您熟悉并且可以提供如何适应 OP 从批处理编译的方式,那将非常有帮助,并且可能值得被接受,而不是我的回答。特别是如果您可以对其进行测试并报告成功。这是我做不到的。 通过for 显示批次计数器很好。使用计数#define调用编译器的实际命令行将是最后的接触。如果它看起来不太徒劳,我建议参考我在回答中提出的健全性检查代码。那么您的答案就是完整的 MS 解决方案。 这对我不起作用,我收到错误“无效的命令行。未知的 Swithc : D” 对不起,多余的空间。我编辑了答案。 /DPROGRAM_NUMBER=20

以上是关于使用批处理文件更改 .c 文件顶部的数字的主要内容,如果未能解决你的问题,请参考以下文章

Python求解:猜数字游戏新建文件以及异常处理

C语言怎改变文件外存地址里的数字?

从ftp服务器进行批量下载,处理文件名保存时重名的问题,更改重名文件名方式为给后面加123等数字,保持后缀不变

bat 批处理文件全部命令

为什么此批处理文件无法更改壁纸(Windows 7)

无论区域设置如何,在批处理文件中拆分 %date%