C Macro函数错误:表达式不能用作函数

wqlqzqxt  于 2023-10-16  发布在  Mac
关注(0)|答案(3)|浏览(165)

this的启发,我尝试编写使用内部函数的宏,但失败了:

#include <string.h>

// Define a helper macro to get the file name from __FILE__
#define FILENAME_ONLY(file) (strrchr(file, '/') ? strrchr(file, '/') + 1 : file)

// Use the helper macro to create MYFILENAME
#define MYFILENAME FILENAME_ONLY(__FILE__)

// Create __MYFILE__ macro
#define __MYFILE__ "[" MYFILENAME "]"

#include <stdio.h>

int main() {
    printf("%s\n", __MYFILE__);
    return 0;
}

我得到:

main.cpp:4:80: error: expression cannot be used as a function
 #define FILENAME_ONLY(file) (strrchr(file, '/') ? strrchr(file, '/') + 1 : file)

请问我错过了什么?

gab6jxml

gab6jxml1#

你可以 * 只 * 连接字符串字面量这种方式。
范例:

printf("%s", "{" "hello" " " "world" "\n");

连接只能在编译时发生。
你不能使用任何东西,但 * 字符串字面量 * 这种方式。
您的宏扩展为:

printf("%s\n", "[" (strrchr("/app/example.c", '/') ? strrchr("/app/example.c", '/') + 1 : "/app/example.c") "]");

它不符合这个标准。
作为一个一般性的评论-避免宏和使用只有当你真的明白你在做什么。宏可能非常危险。
简单的例子:

#define INC(x) ((x)++)

int foo(int y)
{
    return INC(y++);
}
kmpatx3s

kmpatx3s2#

strrchr等在运行时执行。像"[" MYFILENAME "]"这样的字符串连接发生在编译时。你不能把这两者混在一起。
强烈建议在运行时使用 function 执行所有这些操作。

ikfrs5lh

ikfrs5lh3#

问题是你不能用这种方式连接宏:

#define __MYFILE__ "[" MYFILENAME "]"

你为什么不

printf("[%s]\n", MYFILENAME);

顺便说一句,请记住文件夹分隔符'/'用于unix,''用于windows。

相关问题