标签: c-preprocessor

如何使用C预处理器编写while循环?

我从教育/黑客的角度来问这个问题,(我真的不想这样编码).

是否可以仅使用C预处理程序指令实现while循环.我知道宏不能递归扩展,那么如何实现呢?

c while-loop c-preprocessor

66
推荐指数
7
解决办法
5万
查看次数

是否有可能在可变参数宏中迭代参数?

我想知道是否有可能迭代传递给C99中的可变参数宏或使用任何GCC扩展的参数?

例如,是否可以编写一个通用的宏,它接受一个结构,并将其字段作为参数传递,并打印结构中每个字段的偏移量?

像这样的东西:

struct a {
    int a;
    int b;
    int c;
};

/* PRN_STRUCT_OFFSETS will print offset of each of the fields 
   within structure passed as the first argument.
*/

int main(int argc, char *argv[])
{
    PRN_STRUCT_OFFSETS(struct a, a, b, c);

    return 0;
}

c foreach c99 variadic c-preprocessor

66
推荐指数
5
解决办法
5万
查看次数

布尔运算符可以与预处理器一起使用吗?

我想知道是否有可能有预处理器OR或AND语句?我有这个代码,我想在其下运行_DEBUG_UNIT_TEST标签(?).

我想要的是以下内容:

#if _DEBUG || _UNIT_TEST
  //Code here
#endif
Run Code Online (Sandbox Code Playgroud)

如果这是不可能的,有没有一种解决方法来实现相同的事情,而不必使用#elseif

c++ c-preprocessor

65
推荐指数
3
解决办法
4万
查看次数

为什么这个宏被替换为20而不是10?

1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5. 
6. FOO
Run Code Online (Sandbox Code Playgroud)

当我只运行预处理器时,输出文件包含20.

但是,根据我的理解,预处理器只是简单地替换文本.所以这就是我认为正在发生的事情(这显然是错误的但是很蠢):

  1. NUM定义为10.
  2. 因此,在第2行中,NUM被替换为10.所以现在我们有"#define FOO 10".
  3. NUM未定义.
  4. NUM已重新定义,现在为20.
  5. 根据第2行更换FOO,第2行在第4行重新定义之前,为10.

所以我认为输出应该是10而不是20.可以解释它出错的地方吗?

macros c-preprocessor

65
推荐指数
4
解决办法
2866
查看次数

在GNU C宏envSet(名称)中,(void)""名称是什么意思?

我今天遇到了这种语法,无法理解其含义:

// Uses the GNU C statement expression extension
#define envSet(name) ({ \
static int initialised; \
static bool set; \
(void) "" name; \
if (!initialised || !g_cacheEnv) { \
    const char *value = getenv(name); \
    set = value != NULL; \
    initialised = true; \
} \
set; \
})
Run Code Online (Sandbox Code Playgroud)

我无法理解的具体路线是:

(void) "" name; \
Run Code Online (Sandbox Code Playgroud)

有人可以对此有所了解吗?

c macros gcc c-preprocessor

65
推荐指数
3
解决办法
2147
查看次数

预处理器中的C#宏定义

C#能否像使用预处理器语句在C编程语言中那样定义宏?我想简化某些重复语句的常规输入,如下所示:

Console.WriteLine("foo");
Run Code Online (Sandbox Code Playgroud)

c# macros c-preprocessor

64
推荐指数
5
解决办法
11万
查看次数

找出GCC包含的路径是什么

我正在尝试以编程方式#include在Linux上找到路径,据我所知,在实践中意味着找到GCC认为它的内容.(这是真的吗?Clang怎么做?)

根据http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html,一些组件涉及CPU架构和GCC版本; 后者尤其显得棘手; 我想它可以通过运行gcc --version和解析输出(或gcc -v)来获得,但这看起来不够优雅,最糟糕的是脆弱.假设一个程序正在使用GCC编译,从一个代码中执行它可能是另一种选择,但它需要依赖于该假设.

建议的方法是什么?

c linux gcc c-preprocessor

64
推荐指数
2
解决办法
7万
查看次数

可以使用C预处理器来判断文件是否存在吗?

我有一个非常大的代码库(读取:数千个模块),它们在许多项目中共享代码,这些代码都运行在具有不同C++编译器的不同操作系统上.毋庸置疑,维护构建过程可能相当繁琐.

在代码库中有几个地方可以清理代码,只要有一种方法可以让预处理器忽略#includes当前文件夹中不存在的文件.有谁知道实现这一目标的方法?

目前,我们使用了一个#ifdef围绕#include在共享文件,与该#define语句是否没有第二个项目特定的文件#include存在于该项目.这有效,但很难看.人们在添加或删除项目中的文件时经常忘记正确更新定义.我已经考虑过编写一个预构建工具来保持这个文件是最新的,但是如果有一个独立于平台的方法来对预处理器做这个,我宁愿那样做.有任何想法吗?

c++ include c-preprocessor

63
推荐指数
5
解决办法
3万
查看次数

C预处理器如何处理循环依赖?

我想知道C预处理器如何处理循环依赖(#defines).这是我的计划:

#define ONE TWO 
#define TWO THREE
#define THREE ONE

int main()
{
    int ONE, TWO, THREE;
    ONE = 1;
    TWO = 2;
    THREE = 3;
    printf ("ONE, TWO, THREE = %d,  %d, %d \n",ONE,  TWO, THREE);
}
Run Code Online (Sandbox Code Playgroud)

这是预处理器输出.我无法弄清楚为什么输出是这样的.我想知道预处理器在这种情况下采取的各种步骤,以提供以下输出.

# 1 "check_macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "check_macro.c"

int main()
{
 int ONE, TWO, THREE;
 ONE = 1;
 TWO = 2;
 THREE = 3;
 printf ("ONE, TWO, THREE = %d,  %d, %d \n",ONE, TWO, THREE); …
Run Code Online (Sandbox Code Playgroud)

c linux gcc c-preprocessor

63
推荐指数
3
解决办法
4400
查看次数

如何通过#define指令检测LLVM及其版本?

我认为这个问题很清楚.我正在尝试编写一个编译器检测头,以便能够在应用程序中包含有关使用哪个编译器和哪个版本的信息.

这是我正在使用的代码的一部分:

/* GNU C Compiler Detection */
#elif defined __GNUC__
    #ifdef __MINGW32__
        #define COMPILER "MinGW GCC %d.%d.%d"
    #else
        #define COMPILER "GCC %d.%d.%d"
    #endif
    #define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
#endif
Run Code Online (Sandbox Code Playgroud)

哪个可以这样使用:

printf("  Compiled using " COMPILER "\n", COMP_VERSION);
Run Code Online (Sandbox Code Playgroud)

有没有办法检测LLVM及其版本?和CLANG?

c llvm clang c-preprocessor

62
推荐指数
5
解决办法
3万
查看次数

标签 统计

c-preprocessor ×10

c ×6

gcc ×3

macros ×3

c++ ×2

linux ×2

c# ×1

c99 ×1

clang ×1

foreach ×1

include ×1

llvm ×1

variadic ×1

while-loop ×1