下面的代码编译时没有问题:
int main() {
printf("Hi" "Bye");
}
但是,这不能编译:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
这是什么原因呢?
发布于 2016-05-17 07:06:03
字符串文字连接是由预处理器在编译时执行的。这种连接不可能知道test
的值,直到程序实际执行时才知道。因此,这些字符串文字不能连接在一起。
因为一般情况下,对于编译时已知的值不会有这样的结构,所以C标准被设计为将自动连接功能限制在最基本的情况下:当字面上的值紧邻在一起时。
但是,即使它没有以这种方式表达这个限制,或者如果限制是以不同的方式构造的,如果不将连接作为运行时流程,您的示例仍然是不可能实现的。为此,我们有像strcat
这样的库函数。
发布于 2016-05-17 12:46:22
如果您真的想让两个分支都生成编译时字符串常量,以便在运行时进行选择,则需要一个宏。
#include <stdio.h>
#define ccat(s, t, a, b) ((t)?(s a):(s b))
int
main ( int argc, char **argv){
printf("%s\n", ccat("hello ", argc > 2 , "y'all", "you"));
return 0;
}
发布于 2016-05-18 02:21:58
这无法编译,因为printf函数的参数列表是
(const char *format, ...)
和
("Hi" (test ? "Bye" : "Goodbye"))
不适合参数列表。
gcc试图通过想象来理解它
(test ? "Bye" : "Goodbye")
是一个参数列表,抱怨"Hi“不是一个函数。
https://stackoverflow.com/questions/37259472
复制相似问题