当前位置: 首页 > 知识库问答 >
问题:

Gcc预处理器和粘贴

易京
2023-03-14
#define PLATFORM 3
#define PASTER(x,y) x ## _ ## y
#define EVALUATOR(x,y)  PASTER(x,y)
#define PLATFORMSPECIFIC(fun) EVALUATOR(fun, PLATFORM)

extern void PLATFORMSPECIFIC(somefunc)(char *x);
# 1 "xx.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "xx.c"





extern void somefunc_3(char *x);
#define PLATFORM linux
#define PASTER(x,y) x ## _ ## y
#define EVALUATOR(x,y)  PASTER(x,y)
#define PLATFORMSPECIFIC(fun) EVALUATOR(fun, PLATFORM)

extern void PLATFORMSPECIFIC(somefunc)(char *x);

结果如下:

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





extern void somefunc_1(char *x);

我可以做什么来使这个返回'somefunc_linux'?。Clang似乎做得很对,顺便说一句。

共有1个答案

滑文昌
2023-03-14

如果您想使用linux作为名称,可以更改编译器选项来取消对它的定义:

gcc -Ulinux

或符合标准:

gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic

在这里看到更多关于为什么的讨论:为什么C预处理器将单词“Linux”解释为常量“1”?

 类似资料:
  • 问题内容: 我知道反对Java中的预处理器和宏的所有哲学观点。我不同意仅仅因为某些人可能滥用某种语言功能,就应该将其排除在所有人之外。 我想在Java和Scala代码中包含和宏,以进行有效的日志记录。由于对运行时性能的影响,对Exception的任何使用都是不可接受的。那些认为可以在“生产代码”中关闭日志记录的人应该留意Brian Kernighan的建议: 删除错误消息“现在程序正在运行”,就像

  • 在 webpack 中,所有的预处理器需要匹配对应的 loader。vue-loader 允许你使用其它 webpack loader 处理 Vue 组件的某一部分。它会根据 lang 属性自动推断出要使用的 loader。 CSS 例如,使用 Sass 编译我们的 <style> 语言块: npm install sass-loader node-sass --save-dev <style

  • 得益于 vue-loader, 我们可以通过 lang 属性在组件中的<template>, <script> 或 <style> 上使用各种预处理器。 举个例子,我们在 pages/index.vue 组件中使用 Pug, CoffeeScript 和 Sass: <template lang="pug"> h1.red Hello {{ name }}! </template> <scr

  • 这个模板已经预设设置大部分流行的css预处理器,包括 LESS, SASS, Stylus, 和 PostCSS。要使用一个预处理器的话 ,所有你需要做的就是安装相应的webpack loader。例如,使用SASS: npm install sass-loader node-sass --save-dev 你需要安装node-sass,因为saas-loader需要这个依赖项 在组件里面使用预

  • 问题内容: 如果我有一个布尔字段,如: 在我的代码中,我有如下语句: Java预处理程序只是摆脱了if语句和无法访问的代码? 问题答案: 大多数编译器都会删除该语句。例如: 编译完此类后,我将通过命令打印产生的指令清单: 如您所见,不!:)

  • Objective-C Preprocessor不是编译器的一部分,而是编译过程中的一个单独步骤。 简单来说,Objective-C预处理器只是一个文本替换工具,它指示编译器在实际编译之前进行必要的预处理。 我们将Objective-C预处理器称为OCPP。 所有预处理器命令都以井号(#)开头。 它必须是第一个非空白字符,并且为了便于阅读,预处理程序指令应该从第一列开始。 以下部分列出了所有重要的