预处理器 # define MSG(x) #program message(x)

妖怪啊 2018-01-08 02:50:48
大神们,我想实现如下效果

#if COMPILER == COMPILER_MSVC
# define COMP_MESSAGE(x) #pragma message(x)
#else COMPILER == _COMPILER_GNUC
# define COMP_MESSAGE(x) ##warning x
#endif


但编译器报错 error C2162: 应输入宏形参
想问如果要实现类似效果怎么做?
...全文
684 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
妖怪啊 2018-01-17
  • 打赏
  • 举报
回复
感谢9楼和11楼,正是我想要的,结贴了
赵4老师 2018-01-15
  • 打赏
  • 举报
回复
#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n", h(f(1,2))); // 12 printf("%s\n", g(f(1,2))); // f(1,2) return 0; } 宏展开时: 如果宏定义以#开头,不展开参数,直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"; 如果宏定义不以#开头,展开参数,直接替换,由外层向里层,如果碰到的是#开头的宏,不继续往里层展开,往外层展开。 由外层向里层,如果碰到的是以非#开头的宏,继续往里层走,直至最里层,开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS: ##在宏中定义,是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现,是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { char a = 'a'; cout<<g(a)<<endl; // a cout<<g(g(a))<<endl; // a printf("%s\n", h(f(1,2))); // 12 printf("%s\n", g(f(1,2))); // f(1,2) printf("%s\n", g(h(f(1,2)))); // h(f(1,2)) printf("%s\n", h(g(f(1,2)))); // "f(1,2)" printf("%s\n", h(h(f(1,2)))); // "12" system("pause"); return 0; } 预处理后的:(在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E) int main() { char a = 'a'; cout<<"a"<<endl; cout<<"g(a)"<<endl; printf("%s\n", "12"); printf("%s\n", "f(1,2)"); printf("%s\n", "h(f(1,2))"); printf("%s\n", "\"f(1,2)\""); printf("%s\n", "\"12\""); system("pause"); return 0; } --------------------------------------------------- 宏解析 1. ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号,它不能出现于宏替代表的开端和末尾。 例: #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2. 重新扫描和替换 在替换列表中的所有参数替换过之后,预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时,就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换(防止递归)。 例: #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC
  • 打赏
  • 举报
回复
用__pragma是可以的,但是gcc不支持,修改一下: #if defined(_MSC_VER) #define COMP_MESSAGE(x) __pragma(message(x)) #elif defined(__GNUC__) #define __pragma(x) _Pragma (#x) #define COMP_MESSAGE(x) __pragma(message x) #endif 使用: COMP_MESSAGE("this is a #pragma message test")
开心秋水 2018-01-14
  • 打赏
  • 举报
回复
用函数不就行了
Saleayas 2018-01-14
  • 打赏
  • 举报
回复
#define COMP_MESSAGE(x) __pragma( message( #x ) )
paschen 2018-01-12
  • 打赏
  • 举报
回复
引用 6 楼 妖怪啊的回复:
[quote=引用 5 楼 paschen 的回复:] 直接在需要使用这个宏的位置: #if COMPILER == COMPILER_MSVC #pragma message(x) #else COMPILER == _COMPILER_GNUC ##warning x #endif
我的初衷就是想避免这样写,每个地方都要这样写会很麻烦的 最好能一行代码能够处理,这样方便后期在不同平台上替换宏的实现[/quote] 没想出实现你期望的方式,可以参看下:http://en.cppreference.com/w/cpp/preprocessor/replace
妖怪啊 2018-01-12
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
直接在需要使用这个宏的位置: #if COMPILER == COMPILER_MSVC #pragma message(x) #else COMPILER == _COMPILER_GNUC ##warning x #endif
我的初衷就是想避免这样写,每个地方都要这样写会很麻烦的 最好能一行代码能够处理,这样方便后期在不同平台上替换宏的实现
paschen 2018-01-09
  • 打赏
  • 举报
回复
引用 3 楼 妖怪啊的回复:
[quote=引用 1 楼 paschen 的回复:]
由于有#号,编译器把pragma当作一个宏参数了


我知道这个问题,想问就是有没有别的解决方案解决这个问题[/quote]

直接在需要使用这个宏的位置:

#if COMPILER == COMPILER_MSVC
#pragma message(x)
#else COMPILER == _COMPILER_GNUC
##warning x
#endif
赵4老师 2018-01-09
  • 打赏
  • 举报
回复
了解一下代码生成技术。
妖怪啊 2018-01-09
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
由于有#号,编译器把pragma当作一个宏参数了
我知道这个问题,想问就是有没有别的解决方案解决这个问题
paschen 2018-01-08
  • 打赏
  • 举报
回复
#pragma一样是预处理指令,你不能去替换预处理指令
paschen 2018-01-08
  • 打赏
  • 举报
回复
由于有#号,编译器把pragma当作一个宏参数了

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧