如何避免同名函数和宏的定义冲突?

han*_*oko 0 c c-preprocessor

我定义了一个函数和一个像这样的宏来设置矩阵内部的值:

void init_matrix(Matrix *mat, double ea[],  size_t size)
{
    for (int i = 0; i < mat->row; i++)
        for (int j = 0; j < mat->col; j++) {
            if (!(i*mat->col+j<size))
                return;
            mat->entries[i][j] = ea[i*mat->col + j];    
        }
}

#define init_matrix(mat, ...) init_matrix(mat, (double []) {__VA_ARGS__}, sizeof((double []) {__VA_ARGS__})/sizeof(double))
Run Code Online (Sandbox Code Playgroud)

现在工作正常,但我正在考虑将函数声明和宏移到头文件中,然后将该头文件包含到该程序中。但是当我这样做时,它可能会将函数的定义扩展为:

void init_matrix(Matrix *mat, (double []) {double ea[], size_t size}, sizeof((double []) {double ea[], size_t size})/sizeof(double))
Run Code Online (Sandbox Code Playgroud)

这会让一切变得混乱,对吧?我怎样才能避免这种情况?也许将此函数放在文件末尾并在其之前使用 #undef init_matrix ?或者有没有一种方法可以在代码的一部分中取消定义宏并使其像该部分之前和之后一样工作?

Kam*_*Cuk 5

如何避免同名函数和宏的定义冲突?

宏的命名与函数的命名不同。

不要让用户感到困惑。遵循宏名称大写字母的典型约定。让我们弄清楚什么是宏,什么不是。让用户清楚他们请求什么样的初始化。

void init_matrix(Matrix *mat, double ea[],  size_t size)
{
    for (int i = 0; i < mat->row; i++)
        for (int j = 0; j < mat->col; j++) {
            if (!(i*mat->col+j<size))
                return;
            mat->entries[i][j] = ea[i*mat->col + j];    
        }
}

#define INIT_MATRIX(mat, ...)  init_matrix(mat, (double []) {__VA_ARGS__}, sizeof((double []) {__VA_ARGS__})/sizeof(double))
Run Code Online (Sandbox Code Playgroud)

  • 这个答案主要是观点,几乎没有关于 C 的技术信息。观点的流行并不能改变它未能提供回答问题的信息的事实。 (3认同)