C 中的宏在第一次和以后的调用中生成不同的代码
Macros in C that generate different code on the 1st and later calls
如何在 C 中定义宏,以便在头文件中的第一遍中使用“extern”关键字,然后在后续遍中初始化常量变量?我在 Windows 10 电脑上使用 Visual Studio 2022。
目前我的头文件中有类似以下的内容“images.h”
#pragma once
#include <stdio.h>
// Other #includes
typedef const unsigned char CBYTE;
typedef const int CINT;
// Other typedefs
#include "globals.h"
// Rest of the "images.h" header file.
然后在我的“globals.h”文件中有以下代码:
#ifndef _GLOBALS_H_
#define _GLOBALS_H_
extern CBYTE gc_eod16;
extern CINT gc_stf;
#else
CBYTE gc_eod16 = 127;
CINT gc_stf = 2;
#endif
然后在具有主要功能的文件“images.c”中,我有这样的东西:
#include "images.h"
#include "globals.h"
int main(void) {
// Code in main
return 0;
}
因为我有几个编译在一起的源文件,所以我需要使用“extern”关键字,并在其他文件的顶部添加#include“images.h”。
与其在主函数的文件中单独初始化全局常量,我想将它们与“extern”放在一起并在“globals.h”文件中初始化。这看起来编译正常,但是在“globals.h”文件中重复全局常量是不整洁的。
我的问题是,是否有一个宏,以便在第一次包含“globals.h”时,语句:
extern CBYTE gc_eod16;
extern CINT gc_stf;
被生成,然后在下一个 #include 中这些被替换为:
CBYTE gc_eod16 = 127;
CINT gc_stf = 2;
因此在源代码中每个变量都有一行,即第一个 #include "extern" 放在变量类型和名称之前,然后在第二个 #include "extern" 被省略,并且在变量之后附加字符串 "= 127; 等?
这是怎么做到的?如果知道,我将不胜感激。
没有
您希望 pre-processor 记住编译单元之间的事情。无法做到。
做个好邻居,在他们自己的 .cpp
文件中初始化变量。
现在,如果您仍然想以困难的方式做事,您可能想在编译和使用 DLL 时做一些类似于 windows 中所做的事情。
// globals.h
#ifndef BUILDING_GLOBALS
extern CBYTE gc_eod16;
extern CINT gc_stf;
#else
CBYTE gc_eod16 = 127;
CINT gc_stf = 2;
#endif
然后,您只需要修改一个 .cpp
文件,如下所示:
#define BUILDING_GLOBALS
#include "globals.h"
它的行为是这样的:
- 每个没有定义
BUILDING_GLOBALS
的文件都会看到 extern
的东西。
- 只有一个文件将定义
BUILDING_GLOBALS
,该文件将进行初始化。
如何在 C 中定义宏,以便在头文件中的第一遍中使用“extern”关键字,然后在后续遍中初始化常量变量?我在 Windows 10 电脑上使用 Visual Studio 2022。
目前我的头文件中有类似以下的内容“images.h”
#pragma once
#include <stdio.h>
// Other #includes
typedef const unsigned char CBYTE;
typedef const int CINT;
// Other typedefs
#include "globals.h"
// Rest of the "images.h" header file.
然后在我的“globals.h”文件中有以下代码:
#ifndef _GLOBALS_H_
#define _GLOBALS_H_
extern CBYTE gc_eod16;
extern CINT gc_stf;
#else
CBYTE gc_eod16 = 127;
CINT gc_stf = 2;
#endif
然后在具有主要功能的文件“images.c”中,我有这样的东西:
#include "images.h"
#include "globals.h"
int main(void) {
// Code in main
return 0;
}
因为我有几个编译在一起的源文件,所以我需要使用“extern”关键字,并在其他文件的顶部添加#include“images.h”。
与其在主函数的文件中单独初始化全局常量,我想将它们与“extern”放在一起并在“globals.h”文件中初始化。这看起来编译正常,但是在“globals.h”文件中重复全局常量是不整洁的。
我的问题是,是否有一个宏,以便在第一次包含“globals.h”时,语句:
extern CBYTE gc_eod16;
extern CINT gc_stf;
被生成,然后在下一个 #include 中这些被替换为:
CBYTE gc_eod16 = 127;
CINT gc_stf = 2;
因此在源代码中每个变量都有一行,即第一个 #include "extern" 放在变量类型和名称之前,然后在第二个 #include "extern" 被省略,并且在变量之后附加字符串 "= 127; 等?
这是怎么做到的?如果知道,我将不胜感激。
没有
您希望 pre-processor 记住编译单元之间的事情。无法做到。
做个好邻居,在他们自己的 .cpp
文件中初始化变量。
现在,如果您仍然想以困难的方式做事,您可能想在编译和使用 DLL 时做一些类似于 windows 中所做的事情。
// globals.h
#ifndef BUILDING_GLOBALS
extern CBYTE gc_eod16;
extern CINT gc_stf;
#else
CBYTE gc_eod16 = 127;
CINT gc_stf = 2;
#endif
然后,您只需要修改一个 .cpp
文件,如下所示:
#define BUILDING_GLOBALS
#include "globals.h"
它的行为是这样的:
- 每个没有定义
BUILDING_GLOBALS
的文件都会看到extern
的东西。 - 只有一个文件将定义
BUILDING_GLOBALS
,该文件将进行初始化。