我试图找出如何使用C预处理器将#define'd int 连接到#define'字符串.我的编译器是CentOS 5上的GCC 4.1.该解决方案也适用于MinGW.
我想在字符串上附加一个版本号,但我能让它工作的唯一方法是将版本号的副本定义为字符串.
我能找到的最接近的东西是引用宏参数的方法,但它不适用于#defines
这不起作用.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
Run Code Online (Sandbox Code Playgroud)
它不没有工作,#小号或者是因为值为数字,它会扩大到"/home/user/.myapp" 2 6,这是无效的Ç.
这确实有效,但我不喜欢有版本定义的副本,因为我确实需要它们作为数字.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING
Run Code Online (Sandbox Code Playgroud) 在gcc命令行中,我想定义一个字符串-Dname=Mary,然后在我要printf("%s", name);打印的源代码中Mary.
我怎么能这样做?
例如,如何避免两次写'func_name'?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
Run Code Online (Sandbox Code Playgroud)
我想遵循单点真相规则.
C预处理器的版本:
$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
Run Code Online (Sandbox Code Playgroud) 替代标题(以帮助搜索)
- 将预处理程序标记转换为字符串
- 如何从C宏的值创建一个char字符串?
我想在编译时使用C #define来构建文字字符串.
该字符串是为调试,发布等而更改的域.
我想要一些这样的事情:
#ifdef __TESTING
#define IV_DOMAIN domain.org //in house testing
#elif __LIVE_TESTING
#define IV_DOMAIN test.domain.com //live testing servers
#else
#define IV_DOMAIN domain.com //production
#endif
// Sub-Domain
#define IV_SECURE "secure.IV_DOMAIN" //secure.domain.org etc
#define IV_MOBILE "m.IV_DOMAIN"
Run Code Online (Sandbox Code Playgroud)
但预处理器不评估""内的任何内容
必须有办法做到这一点......
我有一个头文件,version.h有一行...
#define VERSION 9
Run Code Online (Sandbox Code Playgroud)
一些文件使用VERSION的定义值作为整数.没关系.
在不改变定义VERSION的方式的情况下,我需要构建一个包含该值的初始化"what"字符串,所以我需要这样的东西......
char *whatversion = "@(#)VERSION: " VERSION;
Run Code Online (Sandbox Code Playgroud)
显然这不会编译,所以不知怎的,我需要得到一个VERSION的预处理值的字符串,基本上给这个...
char *whatversion = "@(#)VERSION: " "9";
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?这可能吗?
在我的一个项目中,我将当前版本定义为十进制值,看起来像这样:
#define MINOR_VERSION 13
Run Code Online (Sandbox Code Playgroud)
为了能够在被要求时输出版本,我需要将十六进制表示形式转换为字符串.目前我正在使用sprintf(),它基本上是这样的:
char buffer[3];
sprintf(buffer, "%2x", MINOR_VERSION);
// output buffer
Run Code Online (Sandbox Code Playgroud)
这有一些缺点,其中一个缺点是代码大小增加,因为需要包含sprintf().此外,值在运行时计算,这无论如何都是浪费的努力.这两个问题对我来说都很重要,因为我在这里使用微控制器.
也许我错过了完全明显的,但我无法想出一个漂亮而干净的宏来为我做转换.原则上我需要一种方法在编译期间转换13为其十六进制表示(2位数,没有通常在前面的0x)0d.
你会建议什么?
我正在查看一些 windows directx 应用程序代码,看到他们使用宏 _T(x) 来设置他们的窗口名称,在查看宏定义时我看到了这个
#define _T(x) __T(x)
Run Code Online (Sandbox Code Playgroud)
然后我跟着看了看__T
#define __T(x) x
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我正在尝试编译一个非常简单的 C 程序:
# program test.c
#include <stdio.h>
int main()
{
printf("HELLO WORLD \"%s\"\n\n", FOO);
}
Run Code Online (Sandbox Code Playgroud)
并编译为
gcc -o prog -D FOO=bar test.c
Run Code Online (Sandbox Code Playgroud)
基本上我希望有以下输出:
HELLO WORLD "bar"
Run Code Online (Sandbox Code Playgroud)
当我尝试编译上述内容时,出现错误
<command line>:1:13: note: expanded from here
#define FOO bar
Run Code Online (Sandbox Code Playgroud)
我什至要做以下事情(是的,我知道这不好):
#indef FOO
define ZZZ sprintf("%s", FOO)
#endif
Run Code Online (Sandbox Code Playgroud) 我有以下模板:
variable = config["variable"] ? config["variable"].as<type>() : default;
Run Code Online (Sandbox Code Playgroud)
我想创建一个宏来更快地完成这项工作,因为写这么多次变得很无聊.我会尝试类似的东西:
#define CONFIG_PARAM(config, key, type, alt) config["key"] ? config["key"].as<type> : alt;
title = CONFIG_PARAM(root, "title", std::string, "")
Run Code Online (Sandbox Code Playgroud)
很明显,那是行不通的.我怎么能这样做?
我正在尝试创建一个sscanf字符串文字,以帮助在C99中防止缓冲区溢出.目标是这样的:
#define MAX_ARG_LEN 16
char arg[MAX_ARG_LEN] = "";
if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)
显而易见的"手动"解决方案如下:
#define MAX_ARG_LEN 16
#define MAX_ARG_CHARS "15"
char arg[MAX_ARG_LEN] = "";
if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)
但是,我希望在缓冲区大小为16的情况下自动生成"%15X".这个链接几乎适用于我的应用程序:将预处理程序标记转换为字符串,但它不处理-1.
建议?
我有以下宏:
#define ASSERT_ITERATOR_VALUE_TYPE(Iterator__, Value_type__) \
static_assert(std::is_same<Value_type__, typename Iterator__::value_type>::value, \
"Expected iterator with value type #Value_type__")
Run Code Online (Sandbox Code Playgroud)
在上面的宏中,我试图Value_type__在作为第二个输入参数的字符串文字中插入/附加标记static_assert.
显然,这不是我想要实现的,因为如果我将宏声明为:
ASSERT_ITERATOR_VALUE_TYPE(std::set<int>::iterator, double);
Run Code Online (Sandbox Code Playgroud)
我会收到消息:
error: static assertion failed: Expected iterator with value type #Value_type__
^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
相反,我想接受这个消息:
error: static assertion failed: Expected iterator with value type double
^^^^^^
Run Code Online (Sandbox Code Playgroud)
是否有某种预处理器巫术可以帮助我达到我想要的目标?
如何在C中的字符串宏中使用另一个宏?
我有这个:
#define MAX_OPERATION_COUNT 10
#define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first 10 were applied."
Run Code Online (Sandbox Code Playgroud)
但我希望第二个宏使用第一个宏的值.例如,在Java中,我会有类似的东西:
public static final int MAX_OPERATION_COUNT = 10;
public static final String MSG_TOO_MANY_OPERATIONS = "Too many operations! Only the first " + MAX_OPERATION_COUNT + " were applied.";
Run Code Online (Sandbox Code Playgroud)
有没有办法在C中做类似的事情?
#define图书馆深处有一个宏,我想快速知道它的确切值。有没有办法将定义的值存储到字符串中以便我可以打印它?
#define intgr 12
#define bnry 0b00000001
#define hex 0x0A
#define str "Hello World"
String myStr;
myStr = intgr;
cout<< myStr << endl; //Simple enough, work no problem
//12 <- actual
//12 <- expected
myStr = bnry; // using "bnry" would not work as #define does not touch inside quotes
cout<< myStr << endl;
//1 <- actual
//0b00000001 <- expected
myStr = hex;
cout<< myStr << endl;
//10 <- actual
//0x0A <- expected
myStr = str;
cout<< myStr << …Run Code Online (Sandbox Code Playgroud)