Tag:

S_ISREG宏未定义

问题 是posix宏S_ISREG,S_ISDIR等linux吗? 我需要找出因为我正在尝试编译CURL并且它试图在Windows上使用它们 我可以使用哪些包含文件在Windows上访问它们。 这是违法的代码 /*we ignore file size for char/block devices, sockets etc*/ if(S_ISREG(fileinfo.st_mode)) uploadfilesize= fileinfo.st_size; } 它会导致错误 error LNK2019: unresolved external symbol _S_ISREG referenced in function _operate file tool_operate.obj 它们在以下问题中引用 如何使用S_ISREG()和S_ISDIR()POSIX宏? 在C和C ++中区分unix目录和文件 在C中读取目录的问题 显然S_ISREG()是一堆posix宏的一部分,显然应该告诉我们文件是否是“常规文件”,但我发现的所有示例都有linux特定的包含文件。

你能在宏中大写粘贴的令牌吗?

在C宏中,是否可以大写粘贴的令牌? 例如,我目前有以下宏: #define TEST(name, keyword) \ test_##name: TEST_##keyword##_KEYWORD 我会调用如下: TEST(test1, TEST1) 这会产生以下结果: test_test1: TEST_TEST1_KEYWORD 现在,不是必须两次输入相同的名称(一次使用所有小写字符,再次使用所有大写字符),有什么方法可以执行以下任一操作,并将标记更改为全部大写字母还是所有小写字母? TEST(test1) or TEST(TEST1) 谢谢,瑞恩

#warning和#error为宏

有没有办法让宏在编译时强制警告和错误? 我目前有这样的事情: #if defined( __clang__ ) # define PRAGMA( x ) _Pragma( #x ) #elif defined( __GNUC__ ) # define PRAGMA( x ) _Pragma( #x ) #elif defined( _MSC_VER ) # define PRAGMA( x ) __pragma( x ) #endif #define STRINGISIZE( str ) #str #define STR( str ) STRINGISIZE( str ) #define LINE STR( __LINE__ […]

在C中编写宏时,如何找到参数的类型和printf说明符?

我想用宏来扩展minunit更有用。 #define mu_assert_equal(actual, expected) do { \ if (actual != expected) { \ char *message = malloc(MAX_ERROR_MESSAGE_LENGTH); \ if (message == NULL) { printf(“malloc failed”); exit(1); } \ snprintf(message, MAX_ERROR_MESSAGE_LENGTH, “required: %s != %s, reality: %s == %lu”, \ #actual, #expected, #actual, actual); \ return message; \ } \ } while (0) 调用: mu_assert_equal(bytes_parsed, 1); […]

C / C ++预处理器宏可以有默认参数值吗?

我们可以为宏参数指定默认参数值吗? 我知道没有任何类型检查,所以我希望默认值只不过是预处理器在未指定参数值的情况下用于宏扩展的一些文本。

为什么这个嵌套的宏替换失败了?

我正在尝试应用X宏概念,以便有可能将所有struct成员初始化为自定义默认(无效)值。 我写下面的代码: #define LIST_OF_STRUCT_MEMBERS_foo \ X(a) \ X(b) \ X(c) #define X(name) int name; struct foo { LIST_OF_STRUCT_MEMBERS_foo }; #undef X #define X(name) -1, static inline void foo_invalidate(struct foo* in) { *in = (struct foo){ LIST_OF_STRUCT_MEMBERS_foo }; } #undef X #define X(name) -1, #define foo_DEFAULT_VALUE { LIST_OF_STRUCT_MEMBERS_foo } #undef X static struct foo test = […]

是否有可能在gcc纯C中使用un const typeof?

我有一个宏使用GCC的typeof来创建一个相同类型的宏参数的变量。 问题是:如果该参数具有const类型,则在宏内创建的变量是const ,我不能使用它。 例如: #include #define DECR(x) ({typeof(x) y; y = x; y–; y;}) int main(void) { const int v = 5; printf(“%d\n”, DECR(v)); return 0; } 汇编给出: $ cc -c -o to tc tc: In function ‘main’: tc:9:2: error: assignment of read-only variable ‘y’ tc:9:2: error: decrement of read-only variable ‘y’ make: *** [to] […]

将0转为无效

在我的C ++实现(Visual Studio 2008实现)中,我在看到以下行 #ifdef NDEBUG #define assert(_Expression) ((void)0) 我不明白需要将0转为void。 在我看来,这 #ifdef NDEBUG #define assert(_Expression) (0) 甚至简单地说 #ifdef NDEBUG #define assert(_Expression) 0 考虑到可以使用assert(expr)的上下文,会这样做。 那么,在这种情况下, int类型为0而不是0类型为0的危险是什么? 任何现实的例子?

使用宏进行类型generics编程:确定类型的技巧?

可以将某些类型的类型generics函数作为C中的宏来执行,例如: #define SQRT(x) (sizeof(x) == sizeof(float) ? sqrtf((x)) : \ sizeof(x) == sizeof(double) ? sqrt((x)) : \ sqrtl((x)) ) 只要x是浮点类型,这(大多数情况下)就可以正常工作。 但是,如果我想要一个可以采用整数类型或指针类型的类型通用宏,它可能具有相同的大小。 有没有一种聪明的方法来测试宏参数是整数还是指针? 整数与浮点类型怎么样?

C测试变量是否在只读部分

我想编写一个低级日志记录function,如下所示: DO_DBG(“some string”, val1, val2) 我想要它做的是,出于性能原因,将指针存储到字符串而不是字符串的副本。 这假定该字符串是只读文字。 为了防止人们不得不调试调试器,如果DO_DBG的第一个参数是在代码与文本等的可写部分中,那么编译器会抱怨会很好。我想知道是否存在这样做的机制。 (我正在使用gcc 4.9.1,ld 2.24)。