我通过示例书从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?
答案 0 :(得分:3)
由于宏是预处理器如何执行文本替换的指令,因此不能将它们分成看起来像宏声明和宏定义的东西,如函数。它们不是功能。
整个宏应该优先进入h文件。
答案 1 :(得分:1)
您只能拆分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
文件中没有多大意义,因为它们将不在公共视图范围内,使得它们#34;死了&# 34; (因为它们不在那里使用)。
通常,宏在C语言的普通意义上不受范围和链接的约束。这些只是可替换的令牌,除非遇到文件结尾,否则是可见的,但#undef
指令也可以撤销它。