At the top of my file I have
#define AGE "42"
Later in the file I use ID multiple times including some lines that look like
1 std::string name = "Obama";
2 std::string str = "Hello " + name + " you are " + AGE + " years old!";
3 str += "Do you feel " + AGE + " years old?";
I get the error:
"error: invalid operands of types ‘const char [35]’ and ‘const char [2]’ to binary ‘operator+’"
on line 3. I did some research and found it was because of how C++ was treating the different strings and was able to fix it by changing "AGE" to "string(AGE)." However, I accidentally missed one of the instances until today and was wondering why the compiler wasn't complaining even though I still had an instance where it was just "AGE".
Through some trial and error I found that I only need string(AGE)
on lines where I don't concatenate another string that was created in the function body.
My questions is "what is going on in the background that C++ doesn't like concatenating a string with a string put there by the preprocessor unless you are also concatenating string that you defined in the function."
This question is related to
c++
string
c-preprocessor
stdstring
AGE
is defined as "42"
so the line:
str += "Do you feel " + AGE + " years old?";
is converted to:
str += "Do you feel " + "42" + " years old?";
Which isn't valid since "Do you feel "
and "42"
are both const char[]
. To solve this, you can make one a std::string
, or just remove the +
:
// 1.
str += std::string("Do you feel ") + AGE + " years old?";
// 2.
str += "Do you feel " AGE " years old?";
In this particular case, an even simpler fix would be to just get rid of the "+" all together because AGE is a string literal and what comes before and after are also string literals. You could write line 3 as:
str += "Do you feel " AGE " years old?";
This is because most C/C++ compilers will concatenate string literals automatically. The above is equivalent to:
str += "Do you feel " "42" " years old?";
which the compiler will convert to:
str += "Do you feel 42 years old?";
I had the same problem in my code. I was concatenating a string to create a string. Below is the part of code.
int scannerId = 1;
std:strring testValue;
strInXml = std::string(std::string("<inArgs>" \
"<scannerID>" + scannerId) + std::string("</scannerID>" \
"<cmdArgs>" \
"<arg-string>" + testValue) + "</arg-string>" \
"<arg-bool>FALSE</arg-bool>" \
"<arg-bool>FALSE</arg-bool>" \
"</cmdArgs>"\
"</inArgs>");
In line 2, there's a std::string
involved (name
). There are operations defined for char[] + std::string
, std::string + char[]
, etc. "Hello " + name
gives a std::string
, which is added to " you are "
, giving another string, etc.
In line 3, you're saying
char[] + char[] + char[]
and you can't just add arrays to each other.
You cannot concatenate raw strings like this. operator+
only works with two std::string
objects or with one std::string
and one raw string (on either side of the operation).
std::string s("...");
s + s; // OK
s + "x"; // OK
"x" + s; // OK
"x" + "x" // error
The easiest solution is to turn your raw string into a std::string
first:
"Do you feel " + std::string(AGE) + " years old?";
Of course, you should not use a macro in the first place. C++ is not C. Use const
or, in C++11 with proper compiler support, constexpr
.
Source: Stackoverflow.com