如何将 C 宏 (#define) 分离到 .h 和 .c 文件中
How to separate C macros (#define) onto .h and .c file
我通过示例书从 CUDA 获得了以下代码:
static void HandleError( cudaError_t err,
const char *file,
int line ) {
if (err != cudaSuccess) {
printf( "%s in %s at line %d\n", cudaGetErrorString( err ),file, line );
exit( EXIT_FAILURE );
}}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
#define HANDLE_NULL( a ) {if (a == NULL) { \
printf( "Host memory failed in %s at line %d\n", \
__FILE__, __LINE__ ); \
exit( EXIT_FAILURE );}}
我想将它分成两个文件 .h 和 .c,如下所示:
#pragma once
#define HANDLE_ERROR
#define HANDLE_NULL
static void HandleError( cudaError_t err, const char *file, int line );
但我不知道如何分隔宏HANDLE_EROOR?
由于宏是预处理器如何执行文本替换的指令,因此不能将它们分成看起来像宏声明和宏定义(如函数)的东西。它们不是函数。
最好将整个宏放入 h 文件中。
只能拆分HandleError
函数的定义,但这需要修改其对外部的链接(静态函数有内部链接且限于文件作用域):
book.h:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
#define HANDLE_NULL( a ) {if (a == NULL) { \
printf( "Host memory failed in %s at line %d\n", \
__FILE__, __LINE__ ); \
exit( EXIT_FAILURE );}}
extern void HandleError( cudaError_t err, const char *file, int line );
book.c:
#include "book.h"
void HandleError( cudaError_t err, const char *file, int line ) {
if (err != cudaSuccess) {
printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
file, line );
exit( EXIT_FAILURE );
}
}
将 HANDLE_ERROR
和 HANDLE_NULL
宏明确移动到 .c
文件中没有多大意义,因为它们将在 public 视图之外,使它们 "dead"(因为它们不在那里使用)。
一般来说,宏在 C 语言的普通意义上不受 scope 或 linkage 的约束。这些只是可替换的标记,除非遇到文件结束,否则它们是可见的,但也可以通过 #undef
指令撤销。
我通过示例书从 CUDA 获得了以下代码:
static void HandleError( cudaError_t err,
const char *file,
int line ) {
if (err != cudaSuccess) {
printf( "%s in %s at line %d\n", cudaGetErrorString( err ),file, line );
exit( EXIT_FAILURE );
}}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
#define HANDLE_NULL( a ) {if (a == NULL) { \
printf( "Host memory failed in %s at line %d\n", \
__FILE__, __LINE__ ); \
exit( EXIT_FAILURE );}}
我想将它分成两个文件 .h 和 .c,如下所示:
#pragma once
#define HANDLE_ERROR
#define HANDLE_NULL
static void HandleError( cudaError_t err, const char *file, int line );
但我不知道如何分隔宏HANDLE_EROOR?
由于宏是预处理器如何执行文本替换的指令,因此不能将它们分成看起来像宏声明和宏定义(如函数)的东西。它们不是函数。
最好将整个宏放入 h 文件中。
只能拆分HandleError
函数的定义,但这需要修改其对外部的链接(静态函数有内部链接且限于文件作用域):
book.h:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
#define HANDLE_NULL( a ) {if (a == NULL) { \
printf( "Host memory failed in %s at line %d\n", \
__FILE__, __LINE__ ); \
exit( EXIT_FAILURE );}}
extern void HandleError( cudaError_t err, const char *file, int line );
book.c:
#include "book.h"
void HandleError( cudaError_t err, const char *file, int line ) {
if (err != cudaSuccess) {
printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
file, line );
exit( EXIT_FAILURE );
}
}
将 HANDLE_ERROR
和 HANDLE_NULL
宏明确移动到 .c
文件中没有多大意义,因为它们将在 public 视图之外,使它们 "dead"(因为它们不在那里使用)。
一般来说,宏在 C 语言的普通意义上不受 scope 或 linkage 的约束。这些只是可替换的标记,除非遇到文件结束,否则它们是可见的,但也可以通过 #undef
指令撤销。