C 根据时间为消息创建宏
我正在尝试为我的C语言程序创建一个宏,以便在printf中使用 正在编译中,正在向我返回警报C4474C 根据时间为消息创建宏,c,macros,printf,C,Macros,Printf,我正在尝试为我的C语言程序创建一个宏,以便在printf中使用 正在编译中,正在向我返回警报C4474 C4474: too many arguments passed for format string 有人知道错误的原因吗?您需要将其他条件级联: #define TIME(t) \ (((t)->tm_hour >= 6 && (t)->tm_hour < 12) ? "Good morning" : \ ((t)->tm_ho
C4474: too many arguments passed for format string
有人知道错误的原因吗?您需要将其他条件级联:
#define TIME(t) \
(((t)->tm_hour >= 6 && (t)->tm_hour < 12) ? "Good morning" : \
((t)->tm_hour >= 12 && (t)->tm_hour < 18) ? "Good afternoon" : \
((t)->tm_hour >= 18 && (t)->tm_hour < 23) ? "Good night" : "")
#定义时间(t)\
(((t)->tm_hour>=6&&(t)->tm_hour<12)?“早上好”:\
((t)->tm_hour>=12&&(t)->tm_hour<18)?“下午好”:\
((t)->tm_hour>=18&&(t)->tm_hour<23)?“晚安”:“
您对这个?:&&&?:…有什么期望代码>语法怎么办?你遇到了一个永远看不到“晚安”的问题;很少有数字同时是18或更大,也小于零。您可能需要…>=18 | |…<6
。您还需要修复?:&&&&:代码>符号指出。将不评估&
的RHS。在宏表达式和参数(因此在宏展开中使用(t)->tm_hour
)周围加上括号也是一种很好的做法。最好在整个宏周围加上()
。@Carol为什么你认为使用宏不好?
可以写满一本书。这里有一些亮点:a)作为宏,所有代码在每次使用时都会被复制。作为一个函数,它只存在一次,并从多个位置调用。b) 正如你通过提问所看到的,它更复杂。如果函数中存在if-else,那么您就可以编写下一段代码,而不是在这里发布。c) 宏会使代码更难阅读和调试。例如,您的名字不好-应该是来自时间的问候\u STR\u
或类似名称。请注意,如果您使用t->tm\u hour
调用它,而不是向它传递struct tm*
,那么您的宏会更灵活。它也将更加简洁。奇怪的是,在一天的23:00到下一天的06:00之间,没有向用户打招呼。然而,这更像是一个用户体验问题,而不是基本编码问题,这个问题已经被公认的答案充分解决了。
C4474: too many arguments passed for format string
#define TIME(t) \
(((t)->tm_hour >= 6 && (t)->tm_hour < 12) ? "Good morning" : \
((t)->tm_hour >= 12 && (t)->tm_hour < 18) ? "Good afternoon" : \
((t)->tm_hour >= 18 && (t)->tm_hour < 23) ? "Good night" : "")