如何将系统环境变量作为宏定义放入 C 头文件?

Posted

技术标签:

【中文标题】如何将系统环境变量作为宏定义放入 C 头文件?【英文标题】:How to put a system environment variables as a macro definitions to a C header file? 【发布时间】:2016-11-03 07:13:51 【问题描述】:

是否有任何简单方法可以用与环境变量列表对应的宏定义填充头文件?

假设我有类似头文件模板的东西:

#pragma once
#ifndef DEFINES_H__INCLUDED
#define DEFINES_H__INCLUDED

//
// I want to place the #defines here...
//

#endif // DEFINES_H__INCLUDED

现在我可以检查系统中是否定义了一些环境变量(在预定义集的范围内)并将相应的#define 放入此标头中。 IE。如果有_SOME_VAR 我想将#define _SOME_VAR 放入标题中。其他变量也是如此。

我不需要完全以这种方式完成这项任务。一般来说,我需要根据环境变量或其他东西来构建我的程序。我使用make 实用程序构建它,但我无法更改makefile 的内容,因为它是自动生成的。

我看到我问了一些问题,比如在autoconf 中从config.in 制作config.h,但我不需要这么重的工具来完成这么简单(乍一看)的任务。

提前谢谢你!

【问题讨论】:

Makefile如何生成? @Danh,来自 Eclipse CDT。 @SergeRoussak 将其添加到问题中,伙计 @SergeRoussak 使用 shell 脚本生成所述配置文件相对容易(至少需要知道你将使用什么 shell)。 只是一个小问题,您正在使用双重编译保护:#pragma once#ifndef #define#pragma once现在在标准中,所以你只能使用这个 【参考方案1】:

您可以使用预处理器选项:Visual Studio 上的 "/D" 或 gcc 上的 "-D"

使用gcc 传递$HOME 环境变量的示例

gcc -std=c11 -o demo demo.c -DMY_HOME=\"$HOME\"

你可以传递多个变量:

gcc -std=c11 -o demo demo.c -DMY_HOME=\"$HOME\" -DMY_USER=\"$USER\"

【讨论】:

我建议改用-DMY_HOME_=\"$HOME\",因为_MY_HOME是保留名称,使用它是一种未定义的行为 我知道-D 选项,但在我的情况下我无法调整命令行(见上文)。【参考方案2】:

找到了! Project->Properties 并选择 C/C++ Build->Settings。 在工具设置下找到预处理器 -D 选项。在此处添加所需的 environment_variable。这会将 -Denvironment_variable 添加到您的构建脚本中。

【讨论】:

【参考方案3】:

最佳变体是将此行放在项目目录中的makefile.defs

ifdef PLATFORM
CFLAGS:=-D$(PLATFORM)
endif

并将$(CFLAGS) 添加到项目属性 > C/C++ Build > Settings > Tool Settings > Miscellaneous 的“Other flags”字段中。

感谢所有回答的人。

【讨论】:

以上是关于如何将系统环境变量作为宏定义放入 C 头文件?的主要内容,如果未能解决你的问题,请参考以下文章

c语言进阶学习笔记——程序环境和预处理

Vs2010 中怎么包含自定义的环境变量?

C语言学习笔记(19)程序环境和预处理

Makefile中的宏定义必须采用 和 么

如何编组从 C 头文件中的宏定义的结构?

string.h是啥头文件